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)