Oh *_* No 3 primitive r function
我正在阅读Hadley Wickham的书"Advanced R"并且遇到了以下代码.
`(` <- function(e1) {
if (is.numeric(e1) && runif(1) < 0.1) {
e1 + 1
} else {
e1
}
}
Run Code Online (Sandbox Code Playgroud)
运行该函数时,我得到了以下输出
> (1)
[1] 1
> (1)
[1] 2
Run Code Online (Sandbox Code Playgroud)
问:为什么(1)运行上述函数而不是((1)?
我也试过以下,
f <- function(e1){if (is.numeric(e1) && runif(1) < 0.1) {
e1 + 1
} else {
e1
}
}
> f(1)
[1] 2
> f1)
Error: unexpected ')' in "f1)"
Run Code Online (Sandbox Code Playgroud)
你可以检查(R中的定义:
> `(`
.Primitive("(")
Run Code Online (Sandbox Code Playgroud)
现在,您(在全局环境中构建一个函数(如果您在控制台上运行该代码,那就是Hadley实际执行的操作).当R查找函数时,它使用在全局环境中启动的搜索路径.因此,它首先找到哈德利的函数定义.这就是它继续工作的原因.
解释的第二部分是R解释器本身.如果它看到像(([或者也可以是+任何其他特殊运算符)的符号,它会查找具有该名称的函数并"重新排列"参数.例如,a + b将"重新排列"为:
call `+` with first argument a and second argument b
Run Code Online (Sandbox Code Playgroud)
并将(anExpression)"重新安排"为"
call `(` with anExpression as only argument
Run Code Online (Sandbox Code Playgroud)
但aFun(aListofArguments)被解释为:
call aFun with aListofArguments as the list of arguments
Run Code Online (Sandbox Code Playgroud)
在这种情况下,(它不是一个函数,而是调用函数的语法的一部分.这是两件不同的事情.
所以,((1)或者你f1)不能工作,但是
`(`(1)
Run Code Online (Sandbox Code Playgroud)
确实.因为当R解释器看到(它会自动查找结束)以完成语法,但是当它看到时
`(`
Run Code Online (Sandbox Code Playgroud)
它知道你正在引用一个名为的函数(.
免责声明:这种解释是概念性的,R解释器的技术细节显然有点复杂.
| 归档时间: |
|
| 查看次数: |
54 次 |
| 最近记录: |