r - Cómo sobrescribir .GlobalEnv con otro entorno

CorePress2024-01-16  10

He probado esto:

myEnv <- new.env()
assign("X", 42, envir = myEnv)
.GlobalEnv <- myEnv

Pero no pasa nada. ¿Hay alguna manera de hacer eso?

El resultado deseado es tener la variable X en .GlobalEnv.

EDITAR: Algunas personas necesitan algo de contexto...

Tengo scripts organizados de esta manera:

# ls R/*
1-import.R
2-data-management.R
3-imputation.R
4-table-1.R
...

Estoy diseñando un paquete que mantendría un directorio oculto con metainformación y datos:

# ls R/.hidden/*
1-import.R.Rdata
1-import.R.duration
2-data-management.R.Rdata
2-data-management.R.duration
...

Crearé una función my_source() que solo generará secuencias de comandos que tengan secuencias de comandos anteriores modificadas. Para esto tengo que manejar un entorno temporal, generar scripts en él y entregar el resultado en .GlobalEnv.

La versión 0.0.1 de este paquete está aquí https://github.com/pietrodito/numbr

¿Qué estás intentando lograr exactamente? No estoy seguro de entender por qué querrías reemplazar tu entorno global. ¿Solo desea ejecutar código dentro de un entorno diferente? ¿O desea copiar todos los valores de myEnv a su entorno global? ¿O eliminar todos los valores del entorno global actual?

- MrFlick

19/03/2021 a las 18:41

He editado la pregunta. Esperaba que el uso de másescribir en el título era obvio.

Pietrodito

19/03/2021 a las 19:06

La variable myEnv tiene que residir en algún lugar. No está claro dónde estaría eso en este caso. Realmente creo que sería mejor que nos dijeras por qué crees que necesitas hacer esto. Puede que haya formas mejores y más idiomáticas de lograr lo que buscas en R.

- MrFlick

19/03/2021 a las 19:51

Si esto es para usar con source(), use el parámetro local= de la función fuente. Eso le permite especificar un parámetro donde se ejecutará el código. Esto le brinda mucho más control que manipular la información de un usuario. entorno global que puede tener efectos secundarios desagradables dependiendo de qué más estén haciendo.

- MrFlick

19/03/2021 a las 20:05

Esto es lo que hago pero al final tengo que hacer que los resultados estén disponibles en .GlobalEnv

Pietroditoh

19/03/2021 a las 20:29



------------------------------------

1) Para copiar todos los elementos de un entorno al entorno global, convierta ese entorno en una lista usando as.list y luego copie el contenido de esa lista al entorno global usando list2env. No está claro si realmente es necesario hacer esto o no. ¿No podrías simplemente dejar los objetos en ese entorno oculto?

list2env(as.list(myEnv), .GlobalEnv)
X
## [1] 42

2) Realmente no recomiendo esto, pero en lugar de modificar el entorno global, es posible colocar myEnv en la ruta de búsqueda y luego puedes hacer referencia a sus objetos siempre que no estén enmascarados por objetos del mismo nombre. en el entorno global.

X <- 43
attach(myEnv)

X
## 43

get("X", "myEnv")
## 42

rm(X)
X
## 42
Nota

Tenga en cuenta que para crearun entorno oculto en su paquete, puede simplemente ponerlo en el código fuente del paquete y no exportarlo.

myEnv <- new.env()

Por ejemplo, el paquete lattice crea un entorno oculto llamado .latticeEnv en este archivo fuente: https://github.com/cran/lattice/blob/master/R/zzz.R

2

He editado la pregunta. No quiero eliminar todos los objetos del entorno solo para sobrescribir los objetos con el mismo nombre, que es lo que sucede de forma predeterminada.

Pietrodito

19/03/2021 a las 20:23

He modificado la respuesta en función de los cambios en la pregunta.

-G. Grothendieck

19/03/2021 a las 20:39



------------------------------------

No estoy seguro de entender lo que tienes en mente, pero comprueba si lo siguiente sirve para tu propósito:

library(rlang)

myEnv <- env()
env_poke(myEnv, "X", 42)
env_bind(myEnv, X = zap()) # Here I use zap() to erase the previous value you can also
                           # overwrite it with another value. 

> myEnv$X
NULL

o puede utilizar el siguiente código si desea que su entorno se contenga a sí mismo:

library(lobstr)
myEnv$self <- myEnv

> ref(myEnv)
o [1:0x2a4c3231e98] <env> 
\-self = [1:0x2a4c3231e98]  # This shows the memory address where your env was created.

>p>

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare