首页 > 解决方案 > 如何调用`function`函数?

问题描述

我正在尝试调用该函数`function`以在 R 代码中定义一个函数。

众所周知™️,`function`当用户使用常规语法时,R内部.Primitive使用它来定义函数,即

mean1 = function (x, ...) base::mean(x, ...)

但是没有什么能阻止我直接调用那个原语。或者我是这么想的。我可以直接调用其他原语(甚至重新定义它们;例如,在疯狂的时刻,我覆盖了 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, ...)))

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

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

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


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

标签: r

解决方案


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

typeof(`function`)
#> [1] "special"

参数没有被评估,所以你实际上传递了quote(formals(mean))而不是formals(mean). 我认为function没有评估技巧直接调用的方法,除了一个空的形式列表,它只是NULL.


推荐阅读