这是一个简单的问题,但答案显然不是那么简单......是否可以将R中的环境结合起来?
E1 = new.env()
E2 = new.env()
E1$x = 25
E2$y = 7
Run Code Online (Sandbox Code Playgroud)
好的,现在我想要一个E3
既有x
又有y
定义的环境(比方说).
c(E1, E2)
#doesn't work
E3 = new.env(E1, E2)
#doesn't work
Run Code Online (Sandbox Code Playgroud)
我找到了其他类似的问题,但它们似乎对我不起作用.
使用案例:也许有一个原因这并不容易......我想这样做的原因是:我使用一些函数来加载数据.以前,我刚刚将它加载到全局环境中,但我现在有许多不同的函数加载不同类型的数据(我根据需要不同地调用它),因此我希望保持加载的数据更加分区.如果我把2条不同的加载函数E1=loadData1()
和E2=loadData2()
,我现在想调用使用变量来自这两个功能一个功能,我想能说with(E1 & E2, someFunction())
.因此,合并我加载的环境似乎是合适的.
那么,合并它们的正确方法是什么?而且,顺便说一下,如果合并环境不是正确的方法,你对如何更好地完成我正在做的事情有不同的建议吗?
G. *_*eck 13
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
Run Code Online (Sandbox Code Playgroud)
您可以根据需要链接任意数量的环境.
请注意,如果最初创建的子项没有父项,则可以稍后使用以下命令添加父项:
parent.env(child) <- parent
Run Code Online (Sandbox Code Playgroud)
因此我们定义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)
Run Code Online (Sandbox Code Playgroud)
如果你不希望修改LoadData1
并LoadData2
从他们现在是什么:
e1 <- LoadData1()
e2 <- LoadData2()
parent.env(e2) <- e1
with(e2, dataFrom1 + dataFrom2)
Run Code Online (Sandbox Code Playgroud)
2) 转换为列表:
with(c(as.list(e1), as.list(e2)), somefunction())
Run Code Online (Sandbox Code Playgroud)
增加第二种方法.
您可以通过组合它们,将环境转换为列表,然后转换回来来实现:
E3 <- as.environment(sapply(c(E1,E2),as.list))
ls(env=E3)
[1] "x" "y"
E3$x
[1] 25
E3$y
[1] 7
Run Code Online (Sandbox Code Playgroud)
我做了这个功能:
> 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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2382 次 |
最近记录: |