【发布时间】:2019-02-08 16:39:41
【问题描述】:
我正在尝试调用函数 `function` 在 R 代码中定义一个函数。
众所周知™️,`function`是一个.Primitive,当用户使用常规语法时,R 在内部使用它来定义函数,即
mean1 = function (x, ...) base::mean(x, ...)
但是没有什么能阻止我直接调用那个原语。 我是这么想的。我可以直接调用其他原语(甚至重新定义它们;例如,在疯狂的时刻I overrode R’s builtin `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 应该有效。但事实并非如此。为什么?
我检查了 R 源代码中 `function` 原语的定义。 do_function is defined in eval.c。我看到它调用了CheckFormals,它确保每个参数都是一个符号,但它失败了。但它为什么要检查这个,这是什么意思?
最重要的是:有没有办法直接调用`function` 原语?
澄清一下:有一些简单的解决方法(这个问题列出了两个,至少还有第三个)。但我想了解这(不)是如何工作的。
【问题讨论】:
-
stackoverflow.com/q/53218422/1968 的副本(我发誓我后来找到了这个)
-
@Moody 在上面链接中的回答指出了rlang::new_function,它可以作为函数直接调用,并且基本上与
function一样。 -
@ArtemSokolov ...当然,但这正是我的
mean3定义所做的。 I’m well aware of workarounds,我只是好奇为什么它似乎不起作用。 -
抱歉造成误会。请在下面查看我的答案。
标签: r