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

Posted

技术标签:

【中文标题】如何将参数值列表应用于 R 中的函数?【英文标题】:How do I apply a list of argument values to a function in R? 【发布时间】:2016-08-17 23:08:45 【问题描述】:

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

但这似乎没有任何作用。

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

【问题讨论】:

建议使用不太容易复制的名称编辑此问题,这样人们就不会无意中从环境中删除具有字母 a 或 b 的其他对象。 【参考方案1】:

也许grep 会解决你的问题:

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

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

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

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

【讨论】:

【参考方案2】:

可以很容易地用循环来完成

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 等的人的实际对象。

【讨论】:

【参考方案3】:

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

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

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

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

【讨论】:

以上是关于如何将参数值列表应用于 R 中的函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 R 中的数据帧创建具有多个参数的函数列表?

从记录类型单列拆分/提取值,将用户定义的函数应用于多行 CTE

将多值列表值传递给 s-s-rS 报告参数的 SSAS 报告操作

如何将值参数传递给 Bootstrap 中的 modal.show() 函数

如何通过可变参数模板将多个构造函数参数转发到数组初始值设定项列表?

如何将所有参数值的函数映射为列表?但在函数定义中有明确的参数名称