从全局环境中删除所有项目

问题描述

我正在尝试创建一个函数,以从全局环境中删除除一到三项之外的所有项。我能够做到一个,但不能做到两个,三个或更多。感谢使用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 <- function(...) {
      names <- as.character(rlang::enexprs(...))
      rm(list=setdiff(ls(pos=1),names),pos=1)
    }
    remove_all_but(a,b)
,

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),envir = envir)
}

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