Создание звонка и зацикливание на столбцах таблицы - PullRequest
1 голос
/ 16 мая 2019

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

library(tidyverse)
library(stringr)
library(rlang)

N <- 100
d <- tibble(a = sample(LETTERS[1:4], N, replace = TRUE),
            b = sample(letters[20:23], N, replace = TRUE),
            x = round(rnorm(N, 100, 20), 1),
            y = as.numeric(sample(30:45, N, replace = TRUE)))

dplyr_xx <- function(d, ...) {
  call_vec <- map_chr(d, ~str_c("as.", class(.), sep = ""))
  d %>%
    mutate_if(is.character, as_factor) %>%
    # ... %>%
    imap_dfc(., ~ .x %>%
               exec(call_vec[.y])) # -> error
}
d %>%
  dplyr_xx(a, x, y)

Как я могу исправить вышеуказанную функцию?

1 Ответ

2 голосов
/ 17 мая 2019

На странице справки ?exec мы видим, что вызываемая функция должна быть указана в качестве первого аргумента, за которым следуют любые дополнительные аргументы этой функции.

В вашем случае call_vec[.y] - это функция, .x - это аргумент. Когда ты пишешь

.x %>% exec(call_vec[.y])

эквивалентно

exec(.x, call_vec[.y])

, который имеет неправильный порядок аргументов (функция теперь является вторым аргументом, а не первым). Изменение порядка решает проблему:

dplyr_xx <- function(d, ...) {
  call_vec <- map_chr(d, ~str_c("as.", class(.), sep = ""))
  d %>% mutate_if(is.character, as_factor) %>%
      ## ... %>%
      imap_dfc(., ~exec(call_vec[.y], .x))
}
d %>% dplyr_xx(a, x, y)
# # A tibble: 100 x 4
#    a     b         x     y
#    <chr> <chr> <dbl> <dbl>
#  1 A     t     150.     34
#  2 A     u     116.     32
#  3 C     w      81.2    30
# ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...