Используйте аргументы функции в purrr :: возможно в противном случае - PullRequest
1 голос
/ 24 сентября 2019

Есть ли способ использовать аргументы, переданные исходной функции в аргументе otherwise, равном purrr::possibly()?

Например (это глупый игрушечный пример - настоящий код включает в себя очистку веб-страниц).за защищенным паролем порталом):

library(tidyverse)
library(purrr)

foo  <- tibble(x = 1:3, y = 1:3)

toyfunction  <- function(x, df = foo) {
   df[x, x] %>%
     mutate(indexed_at = x)
}

# gives an error once we get over 3
map(1:6, toyfunction)

# so, let's make it safe
possiblyversion  <- possibly(toyfunction, otherwise = 12345) 

# this works, but get confusing & inconsistent (I couldn't use map_dfr() if I wanted to!)
map(1:6, possiblyversion)

# ideally, something like this would be possible
idealpossible  <- possibly(
     toyfunction(x, df = foo)
   , otherwise = tibble(x = NA, y = NA, indexed_at = x)
)

# so we get results like this:
idealpossible(6)

# A tibble: 1 x 2
      x          y    indexed_at
  <int>      <int>         <dbl>
     NA         NA            6

Поддержание работы и возвращение согласованных результатов является более высоким приоритетом, чем сбор ошибок и еще много чего, поэтому я не учел safely() или quietly().

Есть ли способ использовать исходные аргументы функции в результатах otherwise?

1 Ответ

0 голосов
/ 24 сентября 2019

Поскольку safely() и possibly() допускают статическое значение только для otherwise=, вам необходимо написать собственную оболочку.Вот грубый пример того, как это может выглядеть

possibly2 <- function(.f, otherwise=NULL) {
  function(...) {
    tryCatch({
      .f(...)  
    }, error = function(e) otherwise(...))
  }
}

wrapped_toy <- possibly2(
  toyfunction, 
  function(x, df) tibble(x = NA, y = NA, indexed_at = {{x}})
)
map_dfr(1:6, wrapped_toy)

Это не делает никакой реальной проверки ошибок, но в основном вы можете передать функцию в otherwise(), которая будет вызываться с теми же параметрами, что ибазовая функция.

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