2012-04-01 101 views
17

我想问一下是否可以将一个环境的所有对象复制/移动到另一个环境。例如:R:将一个环境复制/移动到另一个环境

f1 <- function() { 
    print(v1) 
    print(v2) 
} 

f2 <- function() { 
    v1 <- 1 
    v2 <- 2 

    # environment(f1)$v1 <- v1   # It works 
    # environment(f1)$v2 <- v2   # It works 

    environment(f1) <- environment(f2) # It does not work 
} 

f2() 
f1() 

TNX,提前

回答

22

似乎有至少3周不同的事情可以做:

  1. 克隆的环境(创建一个完全相同的副本)
  2. 复制一个环境到另一个环境
  3. 分享相同的环境内容

克隆:

# Make the source env 
e1 <- new.env() 
e1$foo <- 1 
e1$.bar <- 2 # a hidden name 
ls(e1) # only shows "foo" 

# This will clone e1 
e2 <- as.environment(as.list(e1, all.names=TRUE)) 

# Check it... 
identical(e1, e2) # FALSE 
e2$foo 
e2$.bar 

要复制的内容,你可以做什么@gsk显示。但同样,all.names标志非常有用:

# e1 is source env, e2 is dest env 
for(n in ls(e1, all.names=TRUE)) assign(n, get(n, e1), e2) 

要共享的环境是什么@koshke做到了。这可能通常更有用。结果是一样的,如果创建一个本地函数:

f2 <- function() { 
    v1 <- 1 
    v2 <- 2 

    # This local function has access to v1 and v2 
    flocal <- function() { 
    print(v1) 
    print(v2) 
    } 

    return(flocal) 
} 

f1 <- f2() 
f1() # prints 1 and 2 
+0

这是一个完整的答案 – 2012-04-01 19:19:33

9

试试这个:

f2 <- function() { 
    v1 <- 1 
    v2 <- 2 
    environment(f1) <<- environment() 
} 
+0

你是对的,非常感谢你! – 2012-04-01 15:39:43

+0

+1 - 不错的一个... – Tommy 2012-04-01 17:24:13

5

您可以使用分配:

f1 <- function() { 
    print(v1) 
    print(v2) 
} 

f2 <- function() { 
    v1 <- 1 
    v2 <- 2 

    for(obj in c("v1","v2")) { 
    assign(obj,get(obj),envir=f1.env) 
    } 
} 

如果你不想列出了对象,ls()需要一个环境参数。

而且你必须弄清楚如何获得f1.env在里面F1指向的环境:-)

+0

这是一个非常好的答案 – 2012-04-01 15:42:35

+0

请注意,这段代码简单地将'v1'和'v2'分配到'.GlovalEnv'中... – kohske 2012-04-01 15:44:17

+0

谢谢!这是一个有趣的问题。 @ kohske的解决方案似乎更加优雅(一如既往!)。 – 2012-04-01 15:44:40

1

要做到这一点:

environment(f1) <- environment(f2) # It does not work 

打开f1环境和运行此操作:

ls(load(f2)) 
2

我用这个功能在我的包中复制对象:

copyEnv <- function(from, to, names=ls(from, all.names=TRUE)) { 
    mapply(assign, names, mget(names, from), list(to), 
     SIMPLIFY = FALSE, USE.NAMES = FALSE) 
    invisible(NULL) 
} 
相关问题