如何将参数值列表应用于R中的函数?

时间:2016-04-24 16:11:40

标签: r list apply

假设您的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上有其他问题的答案。不幸的是我找不到它。

3 个答案:

答案 0 :(得分:2)

选项1:这是一种矢量化方法。使用&#34;或&#34;将custom列表粘贴在一起正则表达式分隔符(|)并将其传递给pattern

rm(list = ls(pattern = paste(custom, collapse = "|")))

选项2 :如果您仍想使用lapply(),则必须在envirls()中加入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。