我试图调用函数`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.
为了完整起见,lionel的答案`function`毕竟暗示了一种致电方式。不幸的是,它相当受限制,因为除了以下内容,我们无法传递任何参数定义NULL:
mean5 = `function`(NULL, mean(x, ...))
formals(mean5) = formals(mean)
Run Code Online (Sandbox Code Playgroud)
(请注意,缺少围绕身体的引用!)
当然这是完全不切实际的(无论如何formals<-内部调用as.function)。