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

How do I apply a list of argument values to a function in R?

假设您的 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")

如何将此列表作为 'looped' 参数应用到 ls() 函数?

我试验过:

rm(lapply(custom, function(x) ls(pattern = x)))

但这似乎没有任何作用。

这感觉像是一个很常见的问题,所以我担心在 Whosebug 的其他地方有这个问题的答案。不幸的是我找不到它。

也许grep可以解决您的问题:

rm(list=grep("^[ab]$", ls(), value=T))

将删除对象 a 和 b,但不会删除其他对象。

rm(list=grep("^[ab]", ls(), value=T))

将删除对象 a、aa、b 和 bb,但在环境中保留 c 和 cc。

可以很容易地用一个循环完成

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))

注意我添加了测试。到对象名称的开头,以避免在 运行 这段代码时扰乱人们的环境。我们不想无意中删除人们名为 a 或 b 等的实际对象。

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

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

选项 2: 如果您仍想使用 lapply(),则必须在 ls()rm() 因为 lapply() 本身形成了一个本地环境。而且您还想将 rm() 放入 lapply() 调用中。

lapply(custom, function(x) {
    e <- .GlobalEnv
    rm(list = ls(pattern = x, envir = e), envir = e)
})