2012-04-01 86 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) 
} 
相關問題