R中的< - 调用类

这可能是一个简单的问题.但是,为什么这两个类别不同?

class(call("assign", "x", 2))
[1] "call"

class(call("<-", "x", 2))
[1] "<-"

为什么有一个< – 类的电话?

最佳答案 我有理由相信这种行为是来自S的保留并且与R无关.你正在练习一种相对不明确的R语言部分:使用S3或S4的对象的类是什么?

我们转向答案的源代码:

class
#> function (x)  .Primitive("class")
pryr::show_c_source(.Primitive("class"))
#> class is implemented by R_do_data_class with op = 0

这导致我们到R_do_data_class然后是R_data_class.对象不是S4,并且没有class属性,因此它会失败回到某些默认值.在LANGSXP的情况下,它调用lang2str

/* character elements corresponding to the syntactic types in the
   grammar */
static SEXP lang2str(SEXP obj, SEXPTYPE t)
{
  SEXP symb = CAR(obj);
  static SEXP if_sym = 0, while_sym, for_sym, eq_sym, gets_sym,
    lpar_sym, lbrace_sym, call_sym;
  if(!if_sym) {
    /* initialize:  another place for a hash table */
    if_sym = install("if");
    while_sym = install("while");
    for_sym = install("for");
    eq_sym = install("=");
    gets_sym = install("<-");
    lpar_sym = install("(");
    lbrace_sym = install("{");
    call_sym = install("call");
  }
  if(isSymbol(symb)) {
    if(symb == if_sym || symb == for_sym || symb == while_sym ||
       symb == lpar_sym || symb == lbrace_sym ||
       symb == eq_sym || symb == gets_sym)
      return PRINTNAME(symb);
  }
  return PRINTNAME(call_sym);
}

你可以看到这个函数特殊情况下用自己的类调用了许多函数.

我不认为这些类目前在R源中使用,但您可以自己使用它们:

f <- function(x) UseMethod("f")
f.if <- function(x) "If statement"
f.while <- function(x) "While loop"

x <- quote(if (a) TRUE)
f(x)
#> "If statement"

y <- quote(while(TRUE){})
f(y)
#> "While loop"

(当然,实际执行此操作是一个坏主意,因为这是一个非常深奥的语言角落,没有人会理解它是如何工作的)

点赞