从全局环境中删除除几个项目之外的所有项目

Posted

技术标签:

【中文标题】从全局环境中删除除几个项目之外的所有项目【英文标题】:Removing all but several items from the global environment 【发布时间】:2021-01-10 06:43:48 【问题描述】:

我正在尝试创建一个函数来从全局环境中删除除一到三个项目之外的所有项目。我可以做一个,但不能做两个、三个或更多。使用base Rrlang 对此提供任何帮助

a <- "a"
b <- c(1,2,3,4)
c <- c("M", "F")
remove_all_but <- function(x)
  Sx <- deparse(substitute(x))
  rm(list=Sx,envir=sys.frame(-1))


remove_all_but(a)

remove_all_but(c(a, b))
#> Warning in rm(list = Sx, envir = sys.frame(-1)): object 'c(a, b)' not found

【问题讨论】:

您可以将要删除的变量作为字符传递吗? remove_all_but("a")remove_all_but(c("a", "b")) ? 顺便说一句 remove_all_but(a) 仅删除 a 并保留所有其他。我想你想要相反的结果? 相关:***.com/questions/6190051/… 相关包函数:rdrr.io/cran/varhandle/man/rm.all.but.html 相关:***.com/questions/40622964/… 【参考方案1】:

非常感谢您的所有建议。这真的很有帮助。除了我在关注您的链接时看到的其他内容之外,它还给了我一些想法。以下似乎效果很好。

    remove_all_but <- function(...) 
      names <- as.character(rlang::enexprs(...))
      rm(list=setdiff(ls(pos=1), names), pos=1)
    
    remove_all_but(a,b)

【讨论】:

次要建议:如果您使用rlang::ensyms 而不是rlang::enxprs,您的函数将同时使用符号 (remove_all_but(a,b,c)) 以及字符 (remove_all_but("a","b","c")) 或两者的任意组合.【参考方案2】:

一个基本的 R 解决方案是:

# assign variables to global environment
a <- 1
b <- 2
c <- 3
d <- 4
e <- 5
ls()
#R> [1] "a" "b" "c" "d" "e"

# make function
remove_all_but <- function(...)
  keep <- sapply(match.call(expand.dots = FALSE)$..., deparse)
  rm(list = setdiff(ls(envir = .GlobalEnv), keep), envir = .GlobalEnv)


# use function
remove_all_but(a, b, c)
ls()
#R> [1] "a" "b" "c"

即使remove_all_but 未在全局环境中分配,这也有效。

您可以将sapply(match.call(expand.dots = FALSE)$..., deparse) 替换为sapply(match.call()[-1], deparse)

我们可以通过允许用户选择应该从中删除变量的环境来使其更通用:

# assign variables to an environment
ev <- new.env()
local(envir = ev, 
  a <- 1
  b <- 2
  c <- 3
  d <- 4
  e <- 5
)

ls(envir = ev)
#R> [1] "a" "b" "c" "d" "e"

# make function
remove_all_but <- function(..., envir = .GlobalEnv)
  keep <- sapply(match.call(expand.dots = FALSE)$..., deparse)
  rm(list = setdiff(ls(envir = envir), keep), envir = envir)


# use function
remove_all_but(a, b, c, envir = ev)
ls(envir = ev)
#R> [1] "a" "b" "c"

【讨论】:

以上是关于从全局环境中删除除几个项目之外的所有项目的主要内容,如果未能解决你的问题,请参考以下文章

Gradle 全局构建目录

在组件reactjs之外更改后如何使用全局语言环境

数据从全局数组中消失

在 OS X 上的 IntelliJ 中,如何清除所有全局设置信息、许可等(任何项目外部)

r 从全局环境中删除变量

如何从 nodejs 模块中删除全局上下文?