dplyr pull and select适用于字符输入,但过滤器无效

时间:2019-04-24 22:17:28

标签: r dplyr

我有点困惑。与通常的字符串方法相比,使用 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()无法产生预期结果/返回值的情况下尝试使用更简单的功能来测试自己的想法一个错误。我认为这是一种常见的测试策略。

0 个答案:

没有答案