2012-04-01 16 views
17

Ich möchte fragen, ob es möglich ist, alle Objekte einer Umgebung auf einmal zu kopieren/zu verschieben. Zum Beispiel:R: Kopieren/Verschieben einer Umgebung in eine andere

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 im Voraus

Antwort

22

Es scheint mindestens drei verschiedene Dinge, die Sie tun können:

  1. Klon
  2. Kopieren Sie den Inhalt von einer Umgebung in eine andere Umgebung eine Umgebung (eine exakte Kopie erstellen)
  3. Teilen der gleichen Umgebung

So zu klonen:

# 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 

den Inhalt zu kopieren, können Sie das tun, was @gsk zeigte. Aber auch hier die all.names Flag ist nützlich:

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

Um die Umwelt zu teilen ist, was @koshke tat. Dies ist wahrscheinlich oft viel nützlicher. Das Ergebnis ist das gleiche, als wenn eine lokale Funktion erstellen:

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

es ist eine vollständige Antwort –

9

Try this:

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

Sie haben Recht, vielen Dank! –

+0

+1 - nice one ... – Tommy

5

Sie assign verwenden:

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

Wenn Sie möchten, die nicht auflisten Objekte, ls() nimmt ein Umgebungsargument.

Und Sie werden herausfinden müssen, wie f1.env zu bekommen, eine Umgebung zu sein innen f1 zeigen :-)

+0

Es ist eine sehr gute Antwort –

+0

Beachten Sie, dass dieser Code einfach 'v1' und' v2' in '.GlovalEnv' einordnet ... – kohske

+0

Vielen Dank! Es war eine lustige Frage. @ kohske's Lösung wirkt eleganter (wie immer!). –

1

es tun:

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

Öffnen Sie die f1 Umgebung und führen Sie dies tun:

ls(load(f2)) 
2

ich diese Funktion nutzen in meinem Paket zum Kopieren von Objekten:

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) 
} 
Verwandte Themen