Как правильно разрешить передачу аргументов через ... через несколько функций с картой purrr? - PullRequest
0 голосов
/ 07 мая 2019

Рассмотрим следующие три функции:

f1 <- function(df, ...) {
  df %>%
    mutate(
      model = map(.$splits, ~ f2(.))
    )
}

f2 <- function(split_df) {
  split_df %>%
    analysis() %>% 
    nest() %>%
    mutate(
      forecast = map(data, ~ f3(.$actuals))
    )
}

f3 <- function(x, N = 3, fn = mean, window_size = 6, ...) {
  # stuff
}

Я запускаю эти функции в более крупном конвейере, но суть моего вопроса заключается в следующем: я хотел бы передать аргументы в f3() (например, изменитьfn = mean до fn = median в следующей строке кода:

df_resamples %>%
  mutate(
    result = .$resamples %>% map(~ f1(.))
  )

Однако ни одно из следующих действий не возвращает правильные результаты:

# INCORRECT
df_resamples %>%
  mutate(
    result = .$resamples %>% map(~ f1(.), fn = median)
  )
# ALSO INCORRECT
df_resamples %>%
  mutate(
    result = .$resamples %>% map(~ f1(., fn = median))
  )

Если я жестко кодирую fnв f2 я получаю правильный результат:

f2_good <- function(split_df) {
  split_df %>%
    analysis() %>% 
    nest() %>%
    mutate(
      forecast = map(data, ~ f3(.$actuals, fn = median))
    )
}

Почему я не могу передать fn = median через f3, если я передаю ... из f1?

ПРИМЕЧАНИЕ: я могу решить передать аргументы на f1 и f2, но это не очень сухо, и я подумал, что могу использовать многоточие, чтобы обойти этот подход:

f1 <- function(df, N = 3, fn = mean, window_size = 6) {
  df %>%
    mutate(
      model = map(.$splits, ~ f2(., N = N, fn = fn, window_size = window_size))
    )
}

f2 <- function(split_df, N = 3, fn = mean, window_size = 6) {
  split_df %>%
    analysis() %>% 
    nest() %>%
    mutate(
      forecast = map(data, ~ f3(.$actuals, N = N, fn = fn, window_size = window_size))
    )
}

Выполнение вышеизложенного позволяет мне сделать:

df_resamples %>%
  mutate(
    result = .$resamples %>% map(~ f1(., fn = median))
  )

и получить ожидаемые результаты, но я должен передать значения по умолчанию как f1, так и f2 ...

1 Ответ

0 голосов
/ 07 мая 2019

Вы пытались добавить ... к каждой сигнатуре и вызову функции, например:

f1 <- function(df, ...) {
  df %>%
    mutate(
      model = map(.$splits, ~ f2(., ...))
    )
}

f2 <- function(split_df, ...) {
  split_df %>%
    analysis() %>% 
    nest() %>%
    mutate(
      forecast = map(data, ~ f3(.$actuals, ...))
    )
}

f3 <- function(x, N = 3, fn = mean, window_size = 6, ...) {
  # stuff
}

, а затем позвоните

df_resamples %>%
  mutate(
    result = .$resamples %>% map(~ f1(., fn = median))
  )

РЕДАКТИРОВАТЬ: Toy-Example

f1 <- function(x, ...) f2(x, ...)
f2 <- function(x, ...) f3(x, ...)
f3 <- function(x, fn = mean, na.rm = FALSE, ...) fn(x, na.rm = na.rm) 

f1(c(1,2,3,NA), fn = max, na.rm = TRUE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...