В R есть способ использовать pivot_longer с произвольными аргументами в качестве спецификации cols - PullRequest
2 голосов
/ 03 апреля 2020

Я хочу использовать pivot_longer внутри функции, которая принимает произвольные аргументы. Я попробовал это, что не работает:

tolong <- function(x, ...) {
  x %>%
    pivot_longer(cols = ...)
}

tolong(pheno, fev1, fvc)

Error in build_longer_spec(data, !!cols, names_to = names_to, values_to = values_to,  : 
  object 'fvc' not found 

Я также попробовал cols = c(...), cols = vars(...) и cols = list(...), ни один из которых не работает. Пока я нашел единственный способ заставить его работать:

tolong <- function(x, ...) {
  x %>%
    pivot_longer(cols = vars(...) %>% as.character %>% sub("~", "", .)) 
}

Неужели должен быть более аккуратный способ?

1 Ответ

2 голосов
/ 03 апреля 2020

Используйте enquos для записи эллипсов в качестве входных данных столбца

tolong <- function(x, ...) {
  vars <- enquos(...)
  x %>%
    pivot_longer(cols = c(!!!vars))
}


tolong(anscombe, y1, y2, y3, y4)

# # A tibble: 44 x 6
#       x1    x2    x3    x4 name  value
#    <dbl> <dbl> <dbl> <dbl> <chr> <dbl>
#  1    10    10    10     8 y1     8.04
#  2    10    10    10     8 y2     9.14
#  3    10    10    10     8 y3     7.46
#  4    10    10    10     8 y4     6.58
#  5     8     8     8     8 y1     6.95
#  6     8     8     8     8 y2     8.14
#  7     8     8     8     8 y3     6.77
#  8     8     8     8     8 y4     5.76
#  9    13    13    13     8 y1     7.58
# 10    13    13    13     8 y2     8.74
# # … with 34 more rows
...