r - 如何调用`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`
原语?
只是为了澄清:有一些简单的解决方法(这个问题列出了两个,至少有三分之一)。但我想了解这(不)是如何工作的。
解决方案
这是因为function
是一个特殊的原语:
typeof(`function`)
#> [1] "special"
参数没有被评估,所以你实际上传递了quote(formals(mean))
而不是formals(mean)
. 我认为function
没有评估技巧直接调用的方法,除了一个空的形式列表,它只是NULL
.
推荐阅读
- java - Spring Web:替换 org.springframework.web.method.annotation.ModelAttributeMethodProcessor
- javascript - Javascript multiple functions
- r - 如何在环境变量中添加 R 和 Rtools 路径?
- java - 从设备获取当前时间毫秒并将其转换为具有不同时区的新日期
- mongodb - Query with unknown keys in mongodb
- python - Using Truncated Poisson in Pandas data frame
- java - 如何在 Joda DateTime 序列化期间保持时区?
- php - 不允许您尝试上传的文件类型。在codeigniter中上传docx,pdf文件时
- c++ - 用QT逐行读取JSON
- android-studio - Android Studio 本地主机 MAMP PRO