将方法采购到与.GlobalEnv不同的环境

时间:2011-11-11 14:22:26

标签: r initialization masking robustness

是否可以将方法提供给.GlobalEnv以外的环境?

我对R的屏蔽机制慢慢感到有点沮丧(我可能会在这方面回到自己的问题,但如果你有兴趣,暂时只是尝试使用包RMySQLRSQLite在同一进程中并按此顺序加载它们;使我的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"

知道我可能做错了吗?

1 个答案:

答案 0 :(得分:3)

OMG!我很抱歉,这有点令人尴尬:

我已经转而使用new.env(parent=emptyenv())一致,以便在缓存环境时防止一些内存膨胀,并且习惯了它,我忘了在时间上有不同的父级环境是有意义的; - )< / p>

在这种情况下,NS <- new.env()可以解决问题。