2010-12-10 16 views
18

según la discusión de los estilos de programación R, vi que una vez alguien dijo que puso toda su función personalizada en un nuevo entorno y la conectó. También recuerdo que el entorno R se usaba como una tabla hash. ¿Es este buen estilo? ¿Cuándo quieres poner tus datos/funciones en un nuevo entorno? ¿O simplemente usa el .GlobalEnv lo que sea?cuando desea configurar nuevos entornos en R

EDIT devolver la segunda parte de la pregunta: cómo inspeccionar la variable del mismo nombre para diferentes entornos?

Respuesta

11

Martin M ä chler sugiere que este es el uno es posible que desee considerar attach(), aunque lo sugirió en el contexto de adjuntar un archivo .Rdata a la ruta de búsqueda, pero su Q es esencialmente la misma cosa.

La ventaja es que no satura el entorno global con funciones que podrían sobrescribirse accidentalmente, etc. Si bien no llegaría tan lejos como para llamar a este estilo incorrecto, es mejor que mantenga sus funciones personalizadas. en su propio paquete R personal. Sí, esto implicará un poco de sobrecarga al configurar la estructura del paquete y proporcionar cierta documentación para permitir que se instale el paquete, pero a largo plazo esta es una mejor solución. Con herramientas como roxygen, este proceso es cada vez más fácil de arrancar.

Personalmente, no he encontrado la necesidad de juguetear con los entornos en más de 10 años de uso de R; Las secuencias de comandos bien documentadas que cargan, procesan y analizan datos, limpiar todo lo que me han venido haciendo hasta ahora me han sido útiles hasta ahora.


Otra sugerencia para la segunda parte de su pregunta (ahora suprimido) es el uso de with() (como continuación de @ ejemplo de Josué):

> .myEnv <- new.env() 
> .myEnv$a <- 2 
> a <- 1 
> str(a) 
num 1 
> ls.str(.myEnv, a) 
a : num 2 
> str(.myEnv$a) 
num 2 
> with(.myEnv, a) 
[1] 2 
> a 
[1] 1 
+0

Gracias Gavin. La última vez me ayudaste con la pregunta sobre la fórmula R mutipart. lo siento por esa pregunta que utilicé 'respuesta' para 'comentario' para userid no registrado. – learnbasicR

4

para responder a su segunda pregunta (que ahora se ha borrado), utilice ls.str, o simplemente tener acceso al objeto en el entorno con $:

.myEnv <- new.env() 
.myEnv$a <- 2 
a <- 1 
str(a) 
ls.str(.myEnv, a) 
str(.myEnv$a) 
+0

gracias Joshua. Esto es lo que quería saber. Estaba avergonzado de hacer preguntas básicas y obtener una respuesta RTFM, así que borré esa parte. – learnbasicR

6

Si su ecosistema de datos y el código ha crecido mucho lo suficiente como para que esté considerando aislarlo en un entorno, es mejor que cree un paquete. Un paquete le da mucho más apoyo para:

  • La gestión de un proyecto que está creciendo grande y compleja mediante la separación de código y datos en archivos de modo que hay menos que excavar a través de una sola vez.

  • Un paquete hace que sea muy fácil entregar su trabajo a otra persona para que puedan usar su código y datos.

  • Un paquete proporciona soporte adicional para documentación e informes.

La creación de un paquete de R es tan fácil, simplemente llame package.skeleton(), que cada proyecto de trabajo en obtiene su código y los datos almacenados en un paquete.

La única vez que uso entornos es cuando necesito aislar una ejecución de algún código, generalmente un script escrito por otra persona, para que sus efectos secundarios y nombres de variables no se crucen con los míos. Lo hago por evalq(source('someScript.R', local=TRUE), SomeEnvironment).

+0

¿Por qué no utilizar 'sys.source' en lugar de' evalq (...) '? –

+0

No sabía nada de 'sys.source'. A primera vista, no tiene un argumento 'local' que permita que las variables del entorno padre se filtren y afecten la ejecución del script de origen, que es lo que intento evitar. – Sharpie

Cuestiones relacionadas