是否可以将方法源到 .GlobalEnv
以外的环境?
我慢慢地对 R 的屏蔽机制感到有点沮丧(我可能会在这方面提出一个自己的问题,但如果您感兴趣,目前只需尝试在相同的情况下使用包 RMySQL
和 RSQLite
处理并按此顺序加载它们;使我的 RMySQL 东西崩溃)并且非常非常希望在我的所有脚本中始终使用 <namespace>::foo()
而不是仅使用 foo()
。
但是,使用 <namespace>::foo()
的效率低于使用“本地副本”(例如 namespace..foo <- <namespace>::foo()
;我可以为感兴趣的人提供示例,但自己测试很容易)。
制作本地副本对于我正在加载的其他包来说是一种享受,因为(大多数)确实有命名空间,但在我自己的代码变成“包”之前它确实不。
所以我想“让我们将我的东西来源到 NS <- newenv(parent=emptyenv())
,然后应用与其他包相同的例程”。但 R 不让我这么做:
setGeneric(
name="fooBar",
signature=c("src"),
def=function(src, ...){
standardGeneric("fooBar")
}
)
setMethod(
f="fooBar",
signature=signature(src="character"),
definition=function(src, ...){
cat(src, sep="\n")
}
)
# These would go into:
"Q:/usr/wsp/3.6.2/32bit/root/_SCRATCH/gnrc.R"
"Q:/usr/wsp/3.6.2/32bit/root/_SCRATCH/mthd.R"
# This works:
source("Q:/usr/wsp/3.6.2/32bit/root/_SCRATCH/gnrc.R")
source("Q:/usr/wsp/3.6.2/32bit/root/_SCRATCH/mthd.R")
# This does not:
NS <- new.env(parent=emptyenv())
source("Q:/usr/wsp/3.6.2/32bit/root/_SCRATCH/gnrc.R", local=NS)
source("Q:/usr/wsp/3.6.2/32bit/root/_SCRATCH/mthd.R", local=NS)
eval(parse(file="Q:/usr/wsp/3.6.2/32bit/root/_SCRATCH/gnrc.R"), envir=NS)
eval(parse(file="Q:/usr/wsp/3.6.2/32bit/root/_SCRATCH/mthd.R"), envir=NS)
错误:
> source("Q:/usr/wsp/3.6.2/32bit/root/_SCRATCH/gnrc.R", local=NS)
Error in eval.with.vis(expr, envir, enclos) :
could not find function "setGeneric"
> source("Q:/usr/wsp/3.6.2/32bit/root/_SCRATCH/mthd.R", local=NS)
Error in eval.with.vis(expr, envir, enclos) :
could not find function "setMethod"
知道我可能做错了什么吗?
最佳答案
天哪!抱歉各位,这有点尴尬:
我已改用 new.env(parent=emptyenv())
为了防止缓存环境时内存膨胀,我已经习惯了,以至于我忘记了有时拥有不同的父环境确实有意义;-)
在本例中NS <- new.env()
就可以了。
关于r - 将方法获取到不同于 .GlobalEnv 的环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8095294/