Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:如何合并/组合两个环境?_R_Environment - Fatal编程技术网

R:如何合并/组合两个环境?

R:如何合并/组合两个环境?,r,environment,R,Environment,这是一个简单的问题,但答案显然不是那么简单。。。是否可以在R中组合环境 E1 = new.env() E2 = new.env() E1$x = 25 E2$y = 7 好的,现在我想要一个同时定义了x和y的环境(比如,E3) c(E1, E2) #doesn't work E3 = new.env(E1, E2) #doesn't work 我找到了其他的,但它们似乎不适合我 用例:也许这不容易是有原因的……因此我想这样做的原因是:我使用一些函数来加载数据。以前,我只是将其加载到全局环境中

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

E1 = new.env()
E2 = new.env()
E1$x = 25
E2$y = 7
好的,现在我想要一个同时定义了
x
y
的环境(比如,
E3

c(E1, E2)
#doesn't work
E3 = new.env(E1, E2)
#doesn't work
我找到了其他的,但它们似乎不适合我

用例:也许这不容易是有原因的……因此我想这样做的原因是:我使用一些函数来加载数据。以前,我只是将其加载到全局环境中,但现在我有许多不同的函数加载不同类型的数据(我根据需要调用不同类型的数据),因此我希望使加载的数据更加分区。如果我调用两个不同的加载函数
E1=loadData1()
E2=loadData2()
,现在我想调用一个使用这两个函数中变量的函数,我希望能够使用(E1&E2,someFunction())说
。因此,合并我加载的环境似乎是合适的


那么,合并它们的正确方法是什么?另外,如果合并环境不是正确的方法,您对如何更好地完成我正在做的工作有不同的建议吗?

您可以通过组合环境,将环境转换为列表,然后再转换回:

E3 <- as.environment(sapply(c(E1,E2),as.list))
ls(env=E3)
[1] "x" "y"
E3$x
[1] 25
E3$y
[1] 7
E31)使一个环境成为另一个环境的父环境,并将
与(子环境,…)一起使用。

如果您不想从现在的位置修改
LoadData1
LoadData2

e1 <- LoadData1()
e2 <- LoadData2()
parent.env(e2) <- e1
with(e2, dataFrom1 + dataFrom2)
添加了第二种方法。

我创建了这个函数:

> appendEnv = function(e1, e2) {
+     e1name = deparse(substitute(e1))
+     e2name = deparse(substitute(e2))
+     listE1 = ls(e1)
+     listE2 = ls(e2)
+     for(v in listE2) {
+         if(v %in% listE1) warning(sprintf("Variable %s is in e1, too!", v))
+         e1[[v]] = e2[[v]]
+     }
+ }

> e1 = new.env()
> e2 = new.env()
> e1$x = 1
> e1$y = 2
> e2$y = 3
> e2$z = 4
> appendEnv(e1, e2)
Warning message:
In appendEnv(e1, e2) : Variable y is in e1, too!
> as.list(e1)
$x
[1] 1

$y
[1] 3

$z
[1] 4

+1.同意,但环境是否应该这样使用?当然,函数必须有一种方法返回以前约定的结构中的数据,然后可以由somefunction()进行适当的解析…@andrewzm您是指列表吗?可能更容易,但如果重要的话,环境支持哈希。@James+1谢谢,我想浏览一个列表是在我的脑海中,但我希望有一个更简单的方法…@James作为旁白,我想我应该完全跳过环境的事情,一直浏览列表,那么。为什么不使用列表而不是环境呢?因为编写一个loadData()函数来填充一些变量,然后说return(environment())要比将每个变量放入一个列表更容易。。。我想我可以转换成一个列表,也许这是一种方式,但这似乎只是额外的一步。+1谢谢,这是一个好主意,它直接回答了这个问题,还提出了一个问题,即环境可能有冲突的变量。。。
# 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)
e1 <- LoadData1()
e2 <- LoadData2()
parent.env(e2) <- e1
with(e2, dataFrom1 + dataFrom2)
with(c(as.list(e1), as.list(e2)), somefunction())
> appendEnv = function(e1, e2) {
+     e1name = deparse(substitute(e1))
+     e2name = deparse(substitute(e2))
+     listE1 = ls(e1)
+     listE2 = ls(e2)
+     for(v in listE2) {
+         if(v %in% listE1) warning(sprintf("Variable %s is in e1, too!", v))
+         e1[[v]] = e2[[v]]
+     }
+ }

> e1 = new.env()
> e2 = new.env()
> e1$x = 1
> e1$y = 2
> e2$y = 3
> e2$z = 4
> appendEnv(e1, e2)
Warning message:
In appendEnv(e1, e2) : Variable y is in e1, too!
> as.list(e1)
$x
[1] 1

$y
[1] 3

$z
[1] 4