R - Передача аргументов в `dplyr :: select ()` внутри оболочки - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть функция-обертка, которая использует 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 Ответ

1 голос
/ 07 ноября 2019

Я считаю, что это связано с нестандартной оценкой (NSE) в R. Почему вы не пытаетесь использовать rlang для работы с dplyr функциями, на которые ссылаются здесь .

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 также является правильным, и новый метод интерполяции с помощью оператора curly-curly - хороший ярлык

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...