我有点困惑。与通常的字符串方法相比,使用 dplyr 进行编程可能会让人头疼,但是它提供了更多的功能选项。这是我遇到的一个难题/矛盾之处,我不确定为什么会这样。我唯一能找到的相关答案是this,但不确定是否是整个故事。
考虑以下功能:
library(tidyverse)
#functions
pull_func = function(x, var) {
x %>% pull(!!var)
}
select_func = function(x, var) {
x %>% select(!!var)
}
filter_func = function(x, var, set) {
x %>% filter(!!var %in% set)
}
filter_func2 = function(x, var, set) {
x %>% filter((!!var) %in% set)
}
filter_func3 = function(x, var, set) {
var = enquo(var)
x %>% filter((!!var) %in% set)
}
filter_func4 = function(x, var, set) {
var = sym(var)
x %>% filter((!!var) %in% set)
}
让我们尝试一下虹膜数据集上的类似操作:
> iris %>% pull_func("Species") %>% head()
[1] setosa setosa setosa setosa setosa setosa
Levels: setosa versicolor virginica
> iris %>% select_func("Species") %>% head()
Species
1 setosa
2 setosa
3 setosa
4 setosa
5 setosa
6 setosa
> iris %>% filter_func("Species", set = "virginica") %>% head()
[1] Sepal.Length Sepal.Width Petal.Length Petal.Width Species
<0 rows> (or 0-length row.names)
> iris %>% filter_func2("Species", set = "virginica") %>% head()
[1] Sepal.Length Sepal.Width Petal.Length Petal.Width Species
<0 rows> (or 0-length row.names)
> iris %>% filter_func3("Species", set = "virginica") %>% head()
[1] Sepal.Length Sepal.Width Petal.Length Petal.Width Species
<0 rows> (or 0-length row.names)
> iris %>% filter_func4("Species", set = "virginica") %>% head()
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 6.3 3.3 6.0 2.5 virginica
2 5.8 2.7 5.1 1.9 virginica
3 7.1 3.0 5.9 2.1 virginica
4 6.3 2.9 5.6 1.8 virginica
5 6.5 3.0 5.8 2.2 virginica
6 7.6 3.0 6.6 2.1 virginica
因此,pull()
和select()
有效,但是filter()
无效,除非先使用sym()
调用。这是为什么?这使我浪费了很多时间,因为我经常在尝试filter()
调用之前或在filter()
无法产生预期结果/返回值的情况下尝试使用更简单的功能来测试自己的想法一个错误。我认为这是一种常见的测试策略。