是否可以将变量从全局环境移动到单独的环境中?

Is it possible to move a variable from the global environment into a separate environment?

是否可以将驻留在全局环境中的变量移动到单独的环境中以整理全局命名空间?我了解如何在单独的环境中创建变量 (with(env, ...)),但是在全局环境中创建后是否有一种有效的方法来移动它们。我想可以将它们复制到一个单独的环境中,然后将它们从全局环境中删除,但想知道是否有更有效的方式。

不确定这是否是个好主意,但您可以将它们附加到搜索路径中。从新鲜的香草 R 会话开始试试这个。

a <- 1
b <- 2
attach(as.list(.GlobalEnv), name = "myenv")

rm(a, b)
ls("myenv")
ls()
a
b

您可以在 with 中使用多行。

e1 <- new.env()
e2 <- new.env()

with(e1, {
  k <- l <- m <- 0L
  x <- 1
  fo <- y ~ x
  fun <- function(x) x^2
  })

对象创建于e1

ls(e1)
# [1] "fo"  "fun" "k"   "l"   "m"   "x"  

e2 留空,

ls(e2)
# character(0)

并且在 .GlobalEnv 中,目前只有环境存在。

ls(.GlobalEnv)
# [1] "e1" "e2"

要使用对象,还可以使用 with$

with(e1, fun(2))
# [1] 4

e1$fun(2)
# [1] 4

也许:

library(purrr)

a <- 111
b <- 'hello'

my_envir <- new.env()

names(.GlobalEnv) %>% 
    walk(~ assign(.x, get(.x), envir = my_envir))

eapply(my_envir, function(x) x)
#> $my_envir
#> <environment: 0x7fed59e56dc8>
#> 
#> $a
#> [1] 111
#> 
#> $b
#> [1] "hello"

或者

library(purrr)
a <- 111
b <- 'hello'
my_envir <- new.env()

eapply(.GlobalEnv, function(x) x) %>% 
    discard(is.environment) %>% 
    {walk2(., names(.), ~{
               assign(.y, .x, envir = my_envir)
               exec('rm', .y, envir = .GlobalEnv)}
)}


eapply(my_envir, function(x) x)
#> $a
#> [1] 111
#> 
#> $b
#> [1] "hello"

reprex package (v2.0.1)

于 2021-12-31 创建

使用rlang

library(rlang)
a <- 111
b <- "hello"
my_envir <- env(!!! as.list(.GlobalEnv))

-正在检查

> ls(my_envir)
[1] "a" "b"
> my_envir$a
[1] 111