2

是否可以将方法来源到环境以外的环境.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"

知道我可能做错了什么吗?

4

1 回答 1

3

我的天啊!对不起各位,这有点尴尬:

为了防止在缓存环境时出现一些内存膨胀,我已经切换到new.env(parent=emptyenv())一致使用它,并且已经习惯了它,以至于我忘记了同时拥有不同的父环境确实有意义;-)

在这种情况下NS <- new.env()会成功。

于 2011-11-11T14:31:57.703 回答