我正在尝试使用环境将专用常量保留在全局命名空间之外,并可能相互屏蔽。这导致了一系列警告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.
)}
现在它变得有趣了。我有各种功能需要访问foo
和bar
中的项目。例如:
fooFunc1 <- function (args) {
attach(foo)
on.exit(detach(foo))
## Do foo things.
fooFunc2()
}
现在,fooFunc2
的定义与顶部的attach()
语句类似。这会导致警告foo
中定义的所有内容都已被屏蔽。这是有道理的,因为我们已经在foo
。答案似乎是每个函数都会检查它是否已经在正确的环境中,如果没有则只检查attach()
。但我没有找到一种方法来命名一个环境来使用environmentName()
。
那么人们如何实际影响封装和隐藏在R?必须输入foo$fooVar1
,foo$fooVar2
等似乎很荒谬。与包装with()
中的每个语句相同。我错过了什么?
答案 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中的函数都是闭包,这意味着它们都捆绑了对它们应该运行的环境的引用。默认情况下,每个函数的环境都是创建它的环境,但是你可以使用它来改变它。 environment
或local
功能适用于您想要的任何环境。