如何将参数值列表应用于 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 中的函数?的主要内容,如果未能解决你的问题,请参考以下文章
从记录类型单列拆分/提取值,将用户定义的函数应用于多行 CTE
将多值列表值传递给 s-s-rS 报告参数的 SSAS 报告操作
如何将值参数传递给 Bootstrap 中的 modal.show() 函数