【问题标题】:parenthesis for R functionR函数的括号
【发布时间】:2017-04-07 09:37:46
【问题描述】:

我正在阅读 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 function primitive


    【解决方案1】:

    你可以查看R中(的定义:

    > `(`
    .Primitive("(")
    

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

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

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

    (anExpression) 将被“重新排列”为“

    call `(` with anExpression as only argument
    

    aFun(aListofArguments) 被解释为:

    call aFun with aListofArguments as the list of arguments
    

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

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

    `(`(1) 
    

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

    `(`
    

    它知道你指的是一个名为 ( 的函数。

    免责声明:这个解释是概念性的,R解释器的技术细节显然有点复杂。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-07
      • 2020-02-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多