假设您的R环境中有许多对象,例如:
a <- 4
b <- 3
c <- 2
aa <- 2
bb <- 6
cc <- 9
现在说您要删除环境中以字母“a”或“b”命名的对象。这可以通过
来实现rm(list = ls(pattern = "a"))
rm(list = ls(pattern = "b"))
但是,想象一下,如果想要删除其值出现在列表中的所有对象,例如:
,请尝试更大规模地解决此问题。custom <- list("a", "b")
如何将此列表作为'循环'参数应用于ls()
函数?
我已经尝试过:
rm(lapply(custom, function(x) ls(pattern = x)))
但这似乎没有做任何事情。
这感觉是一个非常常见的问题,所以我担心在stackoverflow上有其他问题的答案。不幸的是我找不到它。
答案 0 :(得分:2)
选项1:这是一种矢量化方法。使用&#34;或&#34;将custom
列表粘贴在一起正则表达式分隔符(|
)并将其传递给pattern
。
rm(list = ls(pattern = paste(custom, collapse = "|")))
选项2 :如果您仍想使用lapply()
,则必须在envir
和ls()
中加入rm()
参数因为lapply()
本身形成了一个本地环境。而且您还希望将rm()
放入lapply()
来电。
lapply(custom, function(x) {
e <- .GlobalEnv
rm(list = ls(pattern = x, envir = e), envir = e)
})
答案 1 :(得分:1)
可以通过循环轻松完成
test.a <- 4
test.b <- 3
test.c <- 2
test.aa <- 2
test.bb <- 6
test.cc <- 9
custom <- c("test.a", "test.b")
for (x in custom) rm(list = ls(pattern = x))
NB我加了测试。到对象名称的开头,以避免在运行此代码时弄乱人们的环境。我们不会无意中删除名为a或b等的实际对象。
答案 2 :(得分:0)
也许grep
可以解决您的问题:
rm(list=grep("^[ab]$", ls(), value=T))
将删除对象a和b,但不会删除任何其他对象。
rm(list=grep("^[ab]", ls(), value=T))
将删除对象a,aa,b和bb,但在环境中保留c和cc。