r - 将方法获取到不同于 .GlobalEnv 的环境

标签 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"

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

最佳答案

天哪!抱歉各位,这有点尴尬:

我已改用 new.env(parent=emptyenv())为了防止缓存环境时内存膨胀,我已经习惯了,以至于我忘记了有时拥有不同的父环境确实有意义;-)

在本例中NS <- new.env()就可以了。

关于r - 将方法获取到不同于 .GlobalEnv 的环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8095294/

相关文章:

r - 如何在ggplot中使用索引号作为x?

C++ 字符串\vector 初始化

c - 如何使用函数指针数组?

python - 如何加速 numpy 数组掩码?

function - 试图将 col.name 附加到向量上

R - 无需图表即可计算布林线的公式?

vb.net - 使用 CheckBox 切换 TextBox 的屏蔽和取消屏蔽

swift - 使用 CALayer 和 UIImage 在 Swift 中屏蔽图像

从 R 中的 data.table 有条件地删除行

python - 修复了带有线程锁的 strptime 异常,但会减慢程序速度