如何调用`function`函数?

Kon*_*lph 26 r

我试图调用函数`function`来定义R代码中的函数.

正如我们所知道`function`.Primitive那样,R 是在内部由R用来在用户使用传统语法时定义函数,即

mean1 = function (x, ...) base::mean(x, ...)
Run Code Online (Sandbox Code Playgroud)

但没有什么可以阻止我直接调用这个原语.或者我想.我可以直接调用其他原语(甚至重新定义它们;例如,在疯狂的时刻我覆盖了R的内置`for`).所以原则上这可能的.

然而,我无法让它工作`function`.这是我试过的:

# Works
mean2 = as.function(c(formals(mean), quote(mean(x, ...))))

# Works
mean3 = eval(call('function', formals(mean), quote(mean(x, ...))))

# Error: invalid formal argument list for "function"
mean4 = `function`(formals(mean), quote(mean(x, ...)))
Run Code Online (Sandbox Code Playgroud)

mean3特别是作品的事实向我表明mean4 应该有效.但事实并非如此.为什么?

我检查了`function`R源中基元的定义.do_function定义于eval.c.我看到它调用CheckFormals,它确保每个参数都是一个符号,这就失败了.但为什么要检查这个,这是什么意思?

最重要的是:有没有办法`function`直接调用原语?


只是为了澄清:有一些简单的解决方法(这个问题列出了两个,至少有三分之一).但我想了解这(不)是如何工作的.

Lio*_*nry 15

这是因为function是一个特殊的原语:

typeof(`function`)
#> [1] "special"
Run Code Online (Sandbox Code Playgroud)

参数不会被评估,因此您实际上已经传递了quote(formals(mean))而不是值formals(mean).我认为function没有评估技巧可以直接调用,除非有一个空的正式列表NULL.

  • 是的因为`for`采用了符号和两个表达式,其中有解析器语法.创建一个pairlist文字没有明确的解析器语法,这就是`function()`所采用的. (5认同)
  • 我实际上尝试引用形式(以及使用`alist`),但是正如您所注意到的那样,这也不起作用。typeof(`for`)``也是“特殊的”,但是手动调用```for``可以工作。 (2认同)

Kon*_*lph 5

为了完整起见,lionel的答案`function`毕竟暗示了一种致电方式。不幸的是,它相当受限制,因为除了以下内容,我们无法传递任何参数定义NULL

mean5 = `function`(NULL, mean(x, ...))
formals(mean5) = formals(mean)
Run Code Online (Sandbox Code Playgroud)

(请注意,缺少围绕身体的引用!)

当然这是完全不切实际的(无论如何formals<-内部调用as.function)。