r - 使 `subset()` 在函数中工作

标签 r

目标是能够使用“子集表达式”(不是逻辑向量)作为用户定义函数的(可选)参数,并使用它来计算数据帧的子集。

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/

相关文章:

r - 使用 dplyr 将函数应用于多个组

html - 在 R 中进行网络抓取时如何修复 HTTP 403 错误?

r - 有没有办法在R Markdown的嵌入式LaTeX方程中使用r代码的结果

r - Travis-CI:在 loadVignetteBuilder 中未找到 Knit

r - 因子列上的 sum(.) 返回不正确的结果

java - R 包 XLConnect 和 choose.files() 之间的奇怪交互

r - 使用先前计算值(滚动)时最有效/矢量化

r - R 中的时间序列与 ggplot2

R ggplot2 : Title and legend in one line

r - R内部的通用 "classes"