Удалить элементы в функции, которые вызывают его остановку в R - PullRequest
0 голосов
/ 29 октября 2019

У меня есть две простые функции: f1 и f2. Предположим, у нас есть доступ только к f2. Как я могу удалить любой фрагмент вывода в f2, который вызывает от f1 до stop, и вернуть остаток вывода?

Мой желаемый вывод показан под кодом.

# FUNCTION #1:
f1 <- function(...){

   r <- list(...)
   lapply(seq_along(r), function(i) if(r[[i]] == 4) stop("Problem") else r[[i]] + 1)
}

# FUNCTION #2:
f2 <- function(...){

   res <- try(f1(...), silent = TRUE)

  # if any 'res' causes 'stop' remove it, and return the rest!
}

# EXAMPLE:
f2(1, 2, 4)

Мой желаемый вывод:

#[[1]]
#[1] 1

#[[2]]
#[1] 2

1 Ответ

0 голосов
/ 29 октября 2019

Логика в f1, кажется, останавливает все, если любой из входов ... получает ошибку.

Таким образом, в f2 вы можете подавать входы в f1 один за другим, нормальный вход получит правильныйoutput.

f1 <- function(...){

   r <- list(...)
     lapply(seq_along(r), function(i) if(r[[i]] == 4) stop("Problem") else r[[i]] + 1)
}

# FUNCTION #2:
f2 <- function(...){

   # res <- try(f1(...), silent = TRUE)
  r <- list(...)
  res = lapply(r, function(fluffybunny){
    tmp =try(f1(fluffybunny))
    if(class(tmp) =="try-error") tmp=NULL
    return(tmp)
  })
  # if any 'res' causes 'stop' remove it, and return the rest!

  res.remove_error =res[!sapply(res, is.null)]
   return(res.remove_error)
}

# EXAMPLE:
result = f2(1, 2, 4)
#> Error in FUN(X[[i]], ...) : Problem

result
#> [[1]]
#> [[1]][[1]]
#> [1] 2
#> 
#> 
#> [[2]]
#> [[2]][[1]]
#> [1] 3

Создано в 2019-10-29 пакетом представить (v0.3.0)


Редактировать:удален результат с try-error из вывода f2.

...