r语言 - 在省略号前使用"not"运算符



我正试图在省略号...之前使用!逻辑运算符来生成一个函数。

下面是一个简单的例子:

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")

最新更新