3

我在这里遇到了一个奇怪的问题:

https://stackoverflow.com/a/11084038/636656

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

> print <- FALSE
> print
[1] FALSE
> print("hi")
[1] "hi"
> 
> sum <- FALSE
> sum(1:10)
[1] 55
> sum
[1] FALSE

相比之下,将函数分配给与基函数相同的名称不会产生相同的行为:

> 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. 为什么:这是避免难以恢复的行为(例如,如果您覆盖rm)的故障保险吗?预测这种行为的原理是什么?

  2. 如何:按命名空间是否有不同的函数和逻辑查找例程?

4

1 回答 1

4

在评估对 的调用时print(),R 搜索(沿其普通搜索路径)名称为 的函数print。您的对象print <- TRUE具有正确的名称,但不是函数,因此搜索会直接跳转到具有正确名称的第一个函数。

这是 John Chambers 的解释,来自“数据分析软件:使用 R 编程”中的“第 13 章:R 的工作原理” 。

函数调用的评估从查找与名称对应的函数开始。“寻找”的规则与上面提到的评估名称的一般规则相同,只是评估器会默默地忽略任何找到的不是函数的对象,允许与非本地函数同名的本地非函数对象,人们倾向于为对象指定名称(例如“c”)所激发的让步。

(我特别喜欢最后一点,这是“人们倾向于……的一种让步”;)


由于您对此感兴趣,因此也值得一看match.fun(),它旨在“提取所需的函数对象,同时避免与其他类型的对象进行不希望的匹配”。它包括以下行,很好地说明了评估者和评估者使用的策略:

FUN <- get(as.character(FUN), mode = "function", envir = envir)
于 2012-06-18T16:59:41.200 回答