dplyrrange () работает с единственной переменной внутри c (), но не с несколькими переменными внутри c () при оценке внутри функции - PullRequest
1 голос
/ 08 марта 2019

Все, что я могу найти в Интернете о tidyeval, либо устарело, либо не соответствует последней версии tidyverse \ dplyr, либо не совсем применимо.

Пример тиббла:

df <- tribble(
       ~var1, ~var2, ~var3,
         1,     2,     3,
         4,     5,     6,
         7,     8,     9
        )

У меня есть небольшая функция, которую я написал:

fun <- function(data, select_var, arrange_var) {
   select_var <- enquo(select_var)
   arrange_var <- enquo(arrange_var)

   data %>%
     select(!!select_var) %>%
     arrange(!!arrange_var)
   }

Функция просто выбирает столбцы и затем упорядочивает их по строкам.

Когда я передаюаргументы функции, она прекрасно работает с одной переменной внутри c ():

fun(df, 
    c(var1,
      var2)),
    c(var2))

Однако, когда я пытаюсь передать ей две переменные, подобные этой:

    fun(df, 
    c(var1,
      var2)),
    c(var1,
      var2))

Я получаюследующая ошибка:

Error: incorrect size (282) at position 1, expecting : 141

Ближайшие ответы стека, которые мне удалось найти: range () не распознает параметр имени столбца и Передать векторимена переменных, чтобы организовать () в dplyr

, но оба из них, кажется, дают ответы, которые включали устаревшие решения (например, упорядочить _ ())

Некоторая большая информация здесь: обзор ресурсов по тендеру от Мары Аверик

и SeparatОбработка и обрезка беспорядочных данных в чистом виде Пола Олдхэма

и, конечно, я копался в: tidyeval

Однако, похоже, никто из них не решает эту проблемугалтель.Я исчерпал свои ресурсы после проведенного дня.Код работает найти в стандартном R-файле, просто он не может заставить его работать внутри функции, но уже готов сдаться, поэтому подумал, что я посмотрю, могли бы вы, замечательные люди, помочь.Заранее спасибо.

1 Ответ

3 голосов
/ 08 марта 2019

Замена arrange_var на ... и указание переменных без включения их в c() заставляет его работать.

library("dplyr")

df <- tribble(
  ~var1, ~var2, ~var3,
  1, 2, 3,
  4, 5, 6,
  7, 8, 9
)

fun <- function(data, select_var, ...) {
  select_var <- enquo(select_var)
  data %>%
    select(!!select_var) %>%
    # You can pass the dots to `arrange` directly
    arrange(...)
}

fun(df, c(var1, var2), var2)
#> # A tibble: 3 x 2
#>    var1  var2
#>   <dbl> <dbl>
#> 1     1     2
#> 2     4     5
#> 3     7     8
fun(df, c(var1, var2), var1, var2)
#> # A tibble: 3 x 2
#>    var1  var2
#>   <dbl> <dbl>
#> 1     1     2
#> 2     4     5
#> 3     7     8

Создано в 2019-03-08 Представьте пакет (v0.2.1)

Оказывается, что только select поддерживает строки и символьные векторы.Как сказано в документации, «В отличие от других глаголов, где строки будут неоднозначными». См. Последний пример для dplyr::select.

# Two alternatives; both work with `select`.
df %>%
  select(var1, var2)
#> # A tibble: 3 x 2
#>    var1  var2
#>   <dbl> <dbl>
#> 1     1     2
#> 2     4     5
#> 3     7     8
df %>%
  select(c(var1, var2))
#> # A tibble: 3 x 2
#>    var1  var2
#>   <dbl> <dbl>
#> 1     1     2
#> 2     4     5
#> 3     7     8

# `arrange` only works with lists on comma separated unquoted variable names.
df %>%
  arrange(var1, var2)
#> # A tibble: 3 x 3
#>    var1  var2  var3
#>   <dbl> <dbl> <dbl>
#> 1     1     2     3
#> 2     4     5     6
#> 3     7     8     9
df %>%
  arrange(c(var, var2))
#> Error: incorrect size (4) at position 1, expecting : 3

Создано в 2019-03-08 по представителю пакета (v0.2.1)

...