R-将参数传递给包装器中的dplyr :: select()

时间:2019-11-07 05:11:48

标签: r dplyr purrr

我有一个使用dplyr::select()的包装函数,但是当我尝试使用它来按名称选择列时,它会抛出一个object * not found error。我知道它与select()使用准引号的方式有关,但我不知道为什么。

这是我使用as_mapper的尝试:

fun1 = as_mapper(~select(.x, .y))
fun1(iris, Species)

Error in .f(.x[[i]], ...) : object 'Species' not found

使用基本功能符号:

fun2 = function(dat, x) {select(substitute(dat), substitute(x))} 
fun2(iris, Species:Sepal.Length)

Error in UseMethod("select_") : 
  no applicable method for 'select_' applied to an object of class "name"

如果有人能阐明为什么发生这些错误,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

我认为这与R中的非标准评估(NSE)有关。为什么不尝试使用rlang来处理dplyr函数,如here所示。

library(magrittr)
 fun2 <-  function(dat, x) {
   x <- rlang::enquo(x)
   dplyr::select(dat,!!x)
 } 

fun2(iris, Species:Sepal.Length) %>% tibble::tibble()

# A tibble: 150 x 1
   .$Species $Petal.Width $Petal.Length $Sepal.Width $Sepal.Length
   <fct>            <dbl>         <dbl>        <dbl>         <dbl>
 1 setosa             0.2           1.4          3.5           5.1
 2 setosa             0.2           1.4          3             4.9
 3 setosa             0.2           1.3          3.2           4.7
 4 setosa             0.2           1.5          3.1           4.6
 5 setosa             0.2           1.4          3.6           5  
 6 setosa             0.4           1.7          3.9           5.4
 7 setosa             0.3           1.4          3.4           4.6
 8 setosa             0.2           1.5          3.4           5  
 9 setosa             0.2           1.4          2.9           4.4
10 setosa             0.1           1.5          3.1           4.9
# ... with 140 more rows

我还要指出,@ MrFlick也是正确的,并且通过curl-curly运算符使用new interpolation method是一个不错的快捷方式