让我们获取环境中的 "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 )
但如果这是真的,这意味着环境框架中可以包含函数指针和函数对象。更加复杂的问题在于,一个函数可以“存在”于一个环境中,但该函数可以被告知它执行的环境是另一个环境。 Chambers SoDA似乎没有答案(这是一本密集的书,也许我错过了!)
因此,我想要一个明确的答案。以下哪些是正确的?或者这里是否存在错误三分法?
nsSd
和pkgSd
是两个不同的对象(虽然它们互为副本),其中pkgSd
中的对象具有其执行环境为ns
nsSd
和pkgSd
是指向同一对象的指针。nsSd
是指向pkgSd
的指针,因此它们被视为相同。
sd()
函数,所以你看到的任何差异都是由于你通过环境和命名空间的访问路径不同造成的。 - Dirk EddelbuettelCLOSXP
。匹配指针被视为相同,否则它会检查相同的formals
、body
和CLOENV(x)
。 - Richie Cottonidentical(body(test1), body(test2))
的结果为FALSE
。 - Richie Cotton