【问题标题】: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

【问题讨论】:

标签: r rlang


【解决方案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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多