我想创建一个函数(CleanEnvir
),它基本上调用remove / rm并从.GlobalEnv
中删除某些对象。
CleanEnvir <- function(pattern = "tmp"){
rm(list = ls()[grep("tmp", ls())], envir = globalenv())
}
keep <- 1
tmp.to.be.removed <- 0
ls()
## does not work
CleanEnvir()
ls()
## does work
rm(list = ls()[grep("tmp", ls())], envir = globalenv())
ls()
答案 0 :(得分:19)
ls()
需要找到正确的位置。默认情况下,它会查看当前帧,即您案例中函数CleanEnvir
的值,因此只会在原始文件中找到"pattern"
。
CleanEnvir <- function(pattern = "tmp") {
objs <- ls(pos = ".GlobalEnv")
rm(list = objs[grep("tmp", objs)], pos = ".GlobalEnv")
}
给出了:
> CleanEnvir <- function(pattern = "tmp") {
+ objs <- ls(pos = ".GlobalEnv")
+ rm(list = objs[grep("tmp", objs)], pos = ".GlobalEnv")
+ }
> ls()
[1] "CleanEnvir" "foo" "keep"
[4] "tmp.to.be.removed"
> CleanEnvir()
> ls()
[1] "CleanEnvir" "foo" "keep"
答案 1 :(得分:8)
您需要在全球环境中进行搜索以及在那里删除:
CleanEnvir <- function(pattern = "tmp"){
rm(list = ls(envir=globalenv())[
grep("tmp", ls(envir=globalenv()))], envir = globalenv())
}
答案 2 :(得分:2)
我得到的最短代码解决方案就是这个:
删除特定变量:
y <- TRUE
CleanEnvir <- function(x) {rm(list=deparse(substitute(x)),envir=.GlobalEnv)}
CleanEnvir(y)
y
deparse替换来粘贴变量名而不是它的值, 确实是pos =&#34; .GlobalEnv&#34;有效,但您也可以使用envir = .GlobalEnv
解决方案2:这实际上允许模式匹配。 (我强烈建议不要这样做,因为你可能会删除你不想意外删除的东西。你想要删除tmp1和tmp2,但是你忘了还有另一个名为Global.tmp和localtmp的变量。温度,例如。
按模式删除:
myvar1 <- TRUE
myvar2 <- FALSE
Pat.clean.Envir <- function(x) { rm(list = ls(.GlobalEnv)[grep(deparse(substitute(x)), ls(.GlobalEnv))], envir = .GlobalEnv) }
Pat.clean.Envir(myvar)
欢呼声。