我想定义一个辅助函数来帮助我更清楚地编写一些布尔过滤器。
\niris这是使用数据集结果的工作示例
library(tidyverse)\n\n\nsepal_config = function(length, width, species, .data) {\n .data$Sepal.Length > length & .data$Sepal.Width < width & .data$Species == species\n}\n\niris %>% \n filter(\n sepal_config(length = 4, width = 3, species = "versicolor", .data = .data) | # 34 rows\n sepal_config(length = 3, width = 3, species = "virginica", .data = .data) # 21 rows\n ) # 55 rows\nRun Code Online (Sandbox Code Playgroud)\n我想在不必传入 的情况下执行此操作.data,并且理想情况下还可以在数据帧范围内评估列名称(即避免此错误)
sepal_config = function(length, width, species) {\n Sepal.Length > length & Sepal.Width < width & Species == species\n}\n\niris %>% \n filter(\n sepal_config(length = 4, width = 3, species = "versicolor") |\n sepal_config(length = 3, width = 3, species = "virginica")\n ) \nRun Code Online (Sandbox Code Playgroud)\nError: Problem with `filter()` input `..1`.\n\xe2\x84\xb9 Input `..1` is `|...`.\nx object \'Sepal.Length\' not found\nRun Code Online (Sandbox Code Playgroud)\n不幸的是,我对 NSE 的了解不够深入,不知道这是否是一个选择。我已经尝试了dplyr 编程指南中的各种技术,但脚注让我觉得我找错了地方。
\n\n\ndplyr\xe2\x80\x99s
\nfilter()的灵感来自于基础 R\xe2\x80\x99ssubset()。subset()提供数据屏蔽,但不提供整洁的评估,因此本章中描述的技术不适用于它。
谢谢,\n阿克希尔
\n您可以将表达式包装在函数中,quo()并使用!!运算符在调用中消除它filter()。
library(dplyr)
sepal_config = function(length, width, species) {
quo(Sepal.Length > length & Sepal.Width < width & Species == species)
}
iris %>%
filter(!!sepal_config(length = 4, width = 3, species = "versicolor") |
!!sepal_config(length = 3, width = 3, species = "virginica"))
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.5 2.3 4.0 1.3 versicolor
2 6.5 2.8 4.6 1.5 versicolor
3 5.7 2.8 4.5 1.3 versicolor
4 4.9 2.4 3.3 1.0 versicolor
5 6.6 2.9 4.6 1.3 versicolor
6 5.2 2.7 3.9 1.4 versicolor
7 5.0 2.0 3.5 1.0 versicolor
8 6.0 2.2 4.0 1.0 versicolor
9 6.1 2.9 4.7 1.4 versicolor
10 5.6 2.9 3.6 1.3 versicolor
...
Run Code Online (Sandbox Code Playgroud)