R函数的括号

parenthesis for R function

我正在阅读 Hadley Wickham 的书 "Advanced R" 并发现了以下代码。

`(` <- function(e1) {
if (is.numeric(e1) && runif(1) < 0.1) {
e1 + 1
} else {
e1
}
}

我在运行调用函数

时得到以下输出
> (1)
[1] 1
> (1)
[1] 2

问:为什么上面的函数是 (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)"

你可以查看R:

(的定义
> `(`
.Primitive("(")

现在您在全局环境中构造一个函数 ((如果您在控制台中 运行 该代码,这就是 Hadley 实际执行的操作)。当 R 查找函数时,它使用从全局环境开始的搜索路径。因此它首先找到 Hadley 的函数定义。这就是它一直有效的原因。

解释的第二部分是R解释器本身。如果它看到像 ( 这样的符号(还有 [+ 或任何其他特殊运算符),它会查找具有该名称和 "rearranges" 参数的函数。例如,a + b 将 "rearranged" 为:

call `+` with first argument a and second argument b

(anExpression) 将 "rearranged" 为

call `(` with anExpression as only argument

aFun(aListofArguments) 被解释为:

call aFun with aListofArguments as the list of arguments

在这种情况下,( 与其说是一个函数,不如说是调用函数的语法的一部分。这是两件不同的事情。

所以 ((1) 或者你的 f1) 不能工作,但是

`(`(1) 

确实如此。因为当 R 解释器看到 ( 时它会自动寻找关闭的 ) 来完成语法,但是当它看到

`(`

它知道你指的是一个名为 (.

的函数

免责声明:此解释是概念性的,R解释器的技术细节显然要复杂一些。