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解释器的技术细节显然要复杂一些。
我正在阅读 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解释器的技术细节显然要复杂一些。