我正试图在省略号...
之前使用!
逻辑运算符来生成一个函数。
下面是一个简单的例子:
library(tidyverse)
myfun <- function(data, ...) {
filter(data, !(...))
}
该功能不起作用,并引发以下错误:
> myfun(iris, Sepal.Width < 4)
Error: Problem with `filter()` input `..1`.
x object 'Sepal.Width' not found
ℹ Input `..1` is `!(...)`.
我怎样才能让它工作?
注意,出于我的目的,我必须否定myfun
内部的条件。
以下是rlang
方法:
myfun <- function(data, ...) {
x <- rlang::enquos(...)
filter(data, !(!!!x))
}
myfun(iris, Sepal.Width < 4)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.8 4.0 1.2 0.2 setosa
2 5.7 4.4 1.5 0.4 setosa
3 5.2 4.1 1.5 0.1 setosa
4 5.5 4.2 1.4 0.2 setosa
一个更好的选择可能是像往常一样简单地进行过滤,然后从原始数据集中删除过滤后的行,例如使用anti_join()
,如下所示:
myfun2 <- function(data, ...) {
discard <- filter(data, ...)
dplyr::anti_join(data, discard, by = colnames(discard))
}
尝试执行以下操作。
library(tidyverse)
library(data.table)
myfun <- function(data, param, argument) {
filter(data, data[[param]] != argument)
}
iris1 = as.data.table(iris)
myfun(iris, param = "Species", argument = "setosa")