【发布时间】:2012-03-05 22:17:34
【问题描述】:
让我们抓取环境“namespace:stats”和“package:stats”
ns = getNamespace( "stats" )
pkg = as.environment( "package:stats" )
现在让我们在两者中获取函数“sd”:
nsSd = get( "sd" , envir = ns , inherits = FALSE )
pkgSd = get( "sd" , envir = pkg , inherits = FALSE )
它们是一样的吗?他们是!但“相同”是什么意思?引用或值相等?
identical( nsSd , pkgSd )
这意味着引用相等,因为以下返回 FALSE:
test1 = function() {}
test2 = function() {}
identical( test1 , test2 )
但如果这是真的,这意味着环境的框架可以在函数对象旁边包含函数指针。使问题进一步复杂化的事实是,一个函数可以“存在”在一个环境中,但可以告诉该函数它的执行环境是另一个环境。钱伯斯苏打水似乎没有答案(这是一本厚厚的书,也许我错过了!)
所以,我想要一个明确的答案。以下哪项是正确的?还是这里有假三分法?
-
nsSd和pkgSd是两个不同的对象(尽管每个对象的副本 其他),其中pkgSd中的对象具有ns作为其执行 环境 -
nsSd和pkgSd是指向同一个对象的指针。 -
nsSd是指向pkgSd的指针,因此它们被视为相同
【问题讨论】:
-
可能值得看一下内部
identical函数的 c 代码。 svn.r-project.org/R/trunk/src/main/identical.c -
它认为你让生活有点太复杂了。我们知道只有一个
sd()函数,因此您看到的任何差异都是由于您分别通过环境和命名空间的访问路径。 -
根据 R 内部手册,函数的类型为
CLOSXP。匹配的指针算作相同,否则它会检查相同的formals、body和任何CLOENV(x)是什么。 -
你的第二个例子在检查身体时失败了。
identical(body(test1), body(test2))是FALSE。 -
德克 - 你能详细说明一下吗?我不知道只有一个sd(),这就是为什么我发布=)看起来你在区分环境和命名空间,你是说包环境和命名空间环境吗?我想你是说答案是上面的 #2 还是 #3?
标签: r