是否可以将方法来源于.GlobalEnv以外的环境?
我对R的掩蔽机制感到有点沮丧(在这方面,我可能会带着自己的问题回来,但如果您感兴趣的话,现在只需尝试在相同的过程中使用包RMySQL和RSQLite,并按此顺序加载它们;使我的RMySQL内容崩溃),并且非常希望切换到始终使用<namespace>::foo(),而不是整个脚本的all中只使用foo()。
然而,使用<namespace>::foo()的效率不如使用“本地副本”(例如,namespace..foo <- <namespace>::foo();我可以为感兴趣的人提供示例,但很容易自己测试)。
制作本地副本对于我正在加载的其他包是一个不错的选择,因为(其中大多数)确实有名称空间,但是在我自己的代码变成"package“之前,它会执行而不是。
因此,我认为“让我们将我的东西提供给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"知道我做错了什么吗?
发布于 2011-11-11 14:31:57
天哪!对不起,伙计们,这有点尴尬:
为了防止缓存环境中的内存膨胀,我已经习惯了使用new.env(parent=emptyenv()),以至于我忘记了有不同的父环境是有意义的;-)
在这种情况下,NS <- new.env()会做到这一点。
https://stackoverflow.com/questions/8095294
复制相似问题