确定当前的环境,或者我可能认为这一切都错了?

时间:2013-12-09 17:32:58

标签: r

我正在尝试使用环境将专用常量保留在全局命名空间之外,并可能相互屏蔽。这导致了一系列警告The following object(s) are masked from ...

我有:

foo <- new.env()
with(foo, {
    # Define variables pertaining to foo.
)}

bar <- new.env()
with(bar, {
    # Define variables pertaining to bar.
)}

现在它变得有趣了。我有各种功能需要访问foobar中的项目。例如:

fooFunc1 <- function (args) {
    attach(foo)
    on.exit(detach(foo))

    ## Do foo things.
    fooFunc2()
}

现在,fooFunc2的定义与顶部的attach()语句类似。这会导致警告foo中定义的所有内容都已被屏蔽。这是有道理的,因为我们已经在foo。答案似乎是每个函数都会检查它是否已经在正确的环境中,如果没有则只检查attach()。但我没有找到一种方法来命名一个环境来使用environmentName()

那么人们如何实际影响封装和隐藏在R?必须输入foo$fooVar1foo$fooVar2等似乎很荒谬。与包装with()中的每个语句相同。我错过了什么?

3 个答案:

答案 0 :(得分:1)

您可以使用以下内容:

if (!"foo" %in% search()) {attach(foo); on.exit(detach(foo))}

或者,使用local

fooFunc1 <- local(function(args) {
  ##Do foo things
  fooFunc2()
 }, env=foo)

答案 1 :(得分:1)

我会再次使用with。例如:

foo <- new.env()
with(foo,{x=1;y=2})
fooFunc1  <- function(){
    xx <- with(foo,{
        x^2+1/2
    })
}

答案 2 :(得分:1)

您可以使用attach(foo, warn.conflicts=FALSE)关闭冲突警告。或者,如果您希望将冗余保留在搜索路径之外,则可以执行以下操作:

try(detach(foo), silent=TRUE)
attach(foo)
on.exit(try(detach(foo), silent=TRUE))

我认为最好的方法是使用您想要运行它们的环境来定义函数。

f <- function(...) {print(...)}
environment(f) <- foo

或等效,

f <- local({
    function(...) {print(...)}
}, env=foo)

R中的函数都是闭包,这意味着它们都捆绑了对它们应该运行的环境的引用。默认情况下,每个函数的环境都是创建它的环境,但是你可以使用它来改变它。 environmentlocal功能适用于您想要的任何环境。