2012-04-01 13 views
17

Me gustaría preguntar si es posible copiar/mover todos los objetos de un entorno a otro, a la vez. Por ejemplo:R: copiar/mover un entorno a otro

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, con antelación

Respuesta

22

Parece que hay al menos 3 cosas diferentes que puede hacer:

  1. Clonar un entorno (crear un duplicado exacto)
  2. copiar el contenido de un entorno a otro entorno
  3. Compartir el mismo entorno

para clonar:

# 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 

Para copiar el contenido, puede hacer lo @gsk mostraron. Pero, de nuevo, la bandera all.names es útil:

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

Para compartir el medio ambiente es lo @koshke lo hicieron. Probablemente esto sea mucho más útil. El resultado es el mismo que si la creación de una función local:

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 una respuesta completa –

9

Prueba esto:

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

¡Tienes razón, muchas gracias! –

+0

+1 - nice one ... – Tommy

5

usted podría utilizar Asignar:

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

Si usted no quiere hacer una lista de la objetos, ls() toma un argumento de entorno.

Y vas a tener que encontrar la manera de llegar a ser f1.env un entorno apuntando hacia el interior f1 :-)

+0

Es una muy buena respuesta –

+0

Tenga en cuenta que este código simplemente asigna 'v1' y' v2' en '.GlovalEnv' ... – kohske

+0

¡Gracias! Fue una pregunta divertida. La solución de @ kohske parece más elegante (¡como siempre!). –

1

hacerlo:

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

Abrir el entorno f1 y correr hacer esto:

ls(load(f2)) 
2

utilizo esta función en mi paquete para copiar objetos:

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