这是一个简单的问题,但答案显然不是那么简单...是否可以在R中组合环境?
E1 = new.env()
E2 = new.env()
E1$x = 25
E2$y = 7
好的,现在我想要一个同时定义了
E3
和x
的环境(例如y
)。c(E1, E2)
#doesn't work
E3 = new.env(E1, E2)
#doesn't work
我找到了其他similar questions,但它们似乎对我没有用。
用例:也许有一个不容易的原因……我要这样做的原因是:我使用一些函数来加载数据。以前,我只是将其加载到全局环境中,但是现在我有许多不同的函数来加载不同类型的数据(根据需要可以对其进行不同的调用),因此我想使加载的数据更加分隔。如果我调用了两个不同的加载函数
E1=loadData1()
和E2=loadData2()
,现在我想调用一个使用这两个函数中的变量的函数,那么我想说with(E1 & E2, someFunction())
。因此,合并我的已加载环境似乎是适当的。那么,合并它们的正确方法是什么?顺便说一句,如果合并环境不是正确的方法,您是否对如何更好地完成我的工作有不同的建议?
最佳答案
1)将一个环境作为另一个环境的父级,并使用with(child, ...)
:
parent <- new.env(); parent$x <- 1
child <- new.env(parent = parent); child$y <- 2
with(child, x + y) # x comes from child and y from parent
## [1] 3
您可以根据需要在尽可能长的链中链接任意数量的环境。
请注意,如果最初创建的孩子没有父母,那么以后可以使用以下方法添加父母:
parent.env(child) <- parent
因此,我们将
LoadData1
和LoadData2
定义为:# define LoadData1 to have a parent argument
LoadData1 <- function(parent = emptyenv()) {
# calculation of environment e goes here
parent.env(e) <- parent
e
}
# define LoadData2 to have a parent argument
LoadData2 <- function(parent = emptyenv()) {
# calculation of environment e goes here
parent.env(e) <- parent
e
}
# run
e1 <- LoadData1()
e2 <- LoadData2(parent = e1)
with(e2, dataFrom1 + dataFrom2)
如果您不想从现在的内容中修改
LoadData1
和LoadData2
:e1 <- LoadData1()
e2 <- LoadData2()
parent.env(e2) <- e1
with(e2, dataFrom1 + dataFrom2)
2)转换为列表:
with(c(as.list(e1), as.list(e2)), somefunction())
添加第二种方法。
关于r - R:您如何合并/合并两个环境?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26057400/