Есть ли механизм исключения в dplyr mutate()
? Я имею в виду способ ловить исключения и обрабатывать их.
Предположим, что у меня есть функция, которая в некоторых случаях выдает ошибку (в примере, если входной сигнал отрицательный), для простоты я определяю функцию, но в реальной жизни это будет функция в некоторых R пакет. Предположим, что эта функция векторизована:
# function throwing an error
my_func <- function(x){
if(x > 0) return(sqrt(x))
stop('x must be positive')
}
my_func_vect <- Vectorize(my_func)
Теперь предположим, что я хочу использовать эту функцию внутри mutate()
.
Если эта функция используется внутри mutate()
, она останавливается на первой ошибке и результат не возвращается:
library(dplyr)
# dummy data
data <- data.frame(x = c(1, -1, 4, 9))
data %>% mutate(y = my_func_vect(x))
# Error in mutate_impl(.data, dots) : Evaluation error: x must be positive.
Есть ли способ отловить ошибку и что-то сделать (например, вернуть NA
) в этом случае, получая результаты для других элементов?
Результат, который я ожидаю, - это то, чего можно достичь, используя цикл с tryCatch()
, то есть что-то вроде:
y <- rep(NA_real_, length(data$x))
for(i in seq_along(data$x)) {
tryCatch({
y[i] <- my_func_vect(data$x[i])
}, error = function(err){})
}
y
# Result is: 1 NA 2 4