这是一个简单的问题,但答案显然不是那么简单...是否可以在R中组合环境?

E1 = new.env()
E2 = new.env()
E1$x = 25
E2$y = 7


好的,现在我想要一个同时定义了E3x的环境(例如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


因此,我们将LoadData1LoadData2定义为:

# 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)


如果您不想从现在的内容中修改LoadData1LoadData2

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/

10-11 02:14
查看更多