目标是能够使用“子集表达式”(不是逻辑向量)作为用户定义函数的(可选)参数,并使用它来计算数据帧的子集。
x <- data.frame(a=1, b=gl(2,5))
f <- function(data, subset) {
if (!missing(subset))
data <- subset(data, subset)
data
}
上面的代码行不通,也行不通
f <- function(data, subset) {
if (!missing(subset))
data <- data[with(data, subset), ]
data
}
在这两种情况下,当提供 subset
时我都会收到错误消息。
> f(x, b == 2)
Error in f(x, b == 2) (from frame.r!322341dM#2) : object 'b' not found
期望的输出:
> f(x)
a b
1 1 1
2 1 1
3 1 1
4 1 1
5 1 1
6 1 2
7 1 2
8 1 2
9 1 2
10 1 2
> f(x, b == 2)
a b
6 1 2
7 1 2
8 1 2
9 1 2
10 1 2
最佳答案
这个似乎可行。你必须告诉 f
第二个参数是一个表达式:
f <- function(data, ss) {
if (!missing(ss)){
e <- substitute(ss)
r <- eval(e, data, parent.frame())
data <- subset(data, r)
}
data
}
# > f(x, b == 2)
# a b
# 6 1 2
# 7 1 2
# 8 1 2
# 9 1 2
# 10 1 2
将参数名称 ss
替换为 subset
将不起作用。我不确定为什么。实际上,我是通过浏览 subset.data.frame
的源代码想到的。
关于r - 使 `subset()` 在函数中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44263576/