2012-05-25 8 views
8

A menudo quiero crear muchas variables en un entorno en el entorno global. Esto se puede hacer fácilmente con el argumento envir al sys.source - si se supone que todas las variables creadas por el archivo que se suministra van a un único entorno.cambio del entorno predeterminado para la asignación de nuevas variables

Pero normalmente trabajo con un archivo que crea conjuntos de variables. Un conjunto debe entrar en un entorno, otro conjunto debe ir a otro entorno, y así sucesivamente. No quiero dividir este archivo en varios archivos y luego realizar varias llamadas al sys.source.

En su lugar, me gustaría un comando que me permita cambiar el entorno predeterminado para la asignación de nuevas variables. Por ejemplo:

e <- new.env() 
setDefaultEnvironment(e) 
tmp <- 2 
e$tmp   # 2 
.GlobalEnv$tmp # Error: object 'tmp' not found 

Pero setDefaultEnvironment no es una orden real.

¿Hay alguna manera segura de hacer este tipo de cosas en R?

+2

Puede proporcionar algunos detalles sobre por qué quiere hacer esto – Dason

+0

@Dason - sí, actualicé la publicación original con más detalles. – user697473

Respuesta

4

La función evalq evaluará su primer argumento en un entorno específico, por lo que puede crear su nuevo entorno y luego ajustar las asignaciones en evalq.

8

Tal vez alguien puede mejorar esto, la eliminación de la necesidad de citar el nombre de la variable:

e <- new.env() 
`%=%` <- function(x,y) {assign(x,y,envir = e)} 

"d" %=% 5 

e$d 
[1] 5 

Pero esto se siente un poco tonto para mí. ¿Tal vez simplemente use assign directamente? Más tipeo, tal vez, pero hace lo que quiere con menos peligro.

+7

'"% =% "<- function (x, y) {assign (as.character (substitute (x)), y, envir = e)}' que debería permitirle hacer simplemente 'd% =% 5' sin las comillas alrededor de la d. – Dason

+0

Incluso puede anular '=' (y/o '<-') temporalmente. Sin embargo, ten cuidado, romperá todo tipo de cosas. ;-) –

10

Lo mejor es ser explícito: cambiar los estados globales es peligroso. Por lo tanto:

e <- new.env() 
with(e, {foo <- bar; foo2 <- bar2}) 

hará el trabajo limpia, con poco ruido, mientras que prominentemente mostrando el entorno en cuestión.

0

En lugar de cambiar el entorno, una manera fácil de hacerlo es guardar todas las variables en una lista.

e <- list() 
e$tmp <- 2 
Cuestiones relacionadas