R 为什么这样做有效?创建与基函数同名的逻辑函数仍然允许使用该函数

R 为什么这样做有效?创建与基函数同名的逻辑函数仍然允许使用该函数,r,R,我在这里遇到了一个奇怪的现象: 似乎分配给与基本函数相同的名称仍然允许您使用基本函数: > print <- FALSE > print [1] FALSE > print("hi") [1] "hi" > > sum <- FALSE > sum(1:10) [1] 55 > sum [1] FALSE >打印 [1] 假的 >打印(“hi”) [1] “嗨” > >总和(1:10) [1] 55 >总数 [1] 假的 相比之下,

我在这里遇到了一个奇怪的现象:

似乎分配给与基本函数相同的名称仍然允许您使用基本函数:

> print <- FALSE
> print
[1] FALSE
> print("hi")
[1] "hi"
> 
> sum <- FALSE
> sum(1:10)
[1] 55
> sum
[1] FALSE
>打印
[1] 假的
>打印(“hi”)
[1] “嗨”
> 
>总和(1:10)
[1] 55
>总数
[1] 假的
相比之下,将函数指定给与基函数相同的名称不会产生相同的行为:

> sum <- function(x) x^2
> sum(1:10)
 [1]   1   4   9  16  25  36  49  64  81 100
> sum
function(x) x^2
>总和(1:10)
[1]   1   4   9  16  25  36  49  64  81 100
>总数
函数(x)x^2
我知道它们位于不同的名称空间中,但我对两件事感到好奇:

  • 为什么:这是故障保护,以避免难以从行为中恢复(例如,如果覆盖
    rm
    )?预测这种行为的原理是什么

  • 如何查找:函数和逻辑是否有不同的查找例程(按名称空间)


  • 在计算对
    print()
    的调用时,R(沿其普通搜索路径)搜索名为
    print
    函数。您的对象
    打印它是因为您没有覆盖函数。您只声明了一个名为
    print
    的新变量。在这个类似问题的答案中解释了这一点:@Andrie我将重写,以便更仔细地使用我的术语。一秒钟。看看我对这个问题的答案。你的答案得到了3票赞成。@gsk3——如果你还没有看过那本书,我肯定会推荐它。另一方面,我认为当
    print(…)
    通过解析器时,整个构造已经被标识为一个调用表达式。这就是评估器如何知道它应该对
    打印
    执行“专用”符号查找的原因。(因为我不太明白解析器和求值器之间的分工,但是,这部分有点像手的波浪,所以我没有回答。)我很确定我在Chambers看过这本书,但这本书在我的另一个办公室。很好的发现,谢谢。继我上面的评论之后,我想这表明是解析器将该构造标识为调用:
    class(parse(text=“PRINT('hi')”)[[1]])
    @JoshO'Brien我有一本黄皮书(“s Programming”),但显然不是同一回事。我会尽快去拿的。
    FUN <- get(as.character(FUN), mode = "function", envir = envir)