我正在尝试调用该函数`function`
在 R 代码中定义函数。
众所周知™️,`function`
is a .Primitive
所用的内部当用户使用常规语法时,通过 R 来定义函数,即
mean1 = function (x, ...) base::mean(x, ...)
但没有什么可以阻止我直接调用该原语。或者我是这么想的。我可以直接调用其他原语(甚至重新定义它们;例如,在疯狂的时刻我重写了 R 的内置函数`for` https://gist.github.com/klmr/d10623a0b4c7e1e9a6523eebee4913d1)。所以这is原则上是可以的。
但我无法让它发挥作用`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
should工作。但事实并非如此。为什么?
我检查了的定义`function`
R 源代码中的原语。do_function定义于eval.c https://github.com/wch/r-source/blob/780021752eb83a71e2198019acf069ba8741103b/src/main/eval.c#L1563-L1577。我看到它调用CheckFormals https://github.com/wch/r-source/blob/780021752eb83a71e2198019acf069ba8741103b/src/main/eval.c#L2101-L2111,这确保每个参数都是一个符号,但这会失败。但为什么要检查这个,这意味着什么?
最重要的是:有没有办法调用`function`
直接原始?
只是为了澄清:有一些简单的解决方法(这个问题列出了两个,并且至少有第三个)。但我想了解这是如何(不)工作的。