Как я могу заставить al oop пропускать вводы, которые генерируют предупреждения? - PullRequest
1 голос
/ 26 мая 2020

Я выполняю сложную функцию (множественное вменение с Амелией) над списком наборов данных. Время от времени набор данных вызывает длинный список предупреждений, которые в конечном итоге приводят к ошибке. Я бы хотел, чтобы R сдался, как только появится первое предупреждение, и перешел к следующему набору данных. Вот минимальный рабочий пример:

df.list <- list(
  data.frame(1:4), 
  data.frame(-1, -2,  -4), 
  data.frame(10:15)
)

for(df in df.list){
  ans <- sum(sapply(df, sqrt))
  print(ans)
}

Сценарий выдает три предупреждения о NaN, а затем печатает:

[1] 6.146264
[1] NaN
[1] 21.1632

Я бы хотел, чтобы он выдал 1 сообщение input 2 failed и затем выведет только действительные результаты:

[1] 6.146264
[1] 21.1632

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

1 Ответ

0 голосов
/ 26 мая 2020

Что насчет этого: функция sqrt не может вернуть -1, поэтому я заставляю tryCatch возвращать -1 при появлении предупреждения. Вложенный lapply требуется, чтобы l oop через элементы списка вычислял квадрат root, возвращаемый как список, а затем l oop через эти элементы списка для суммирования. Значение -1 в результате указывает на неудачный расчет, и я могу это проверить.

result <- unlist(
  lapply(
    lapply(df.list, function(x) tryCatch(sqrt(x), warning = function(w) -1)), sum))
failed <- which(result == -1)
result <- result[-failed]
print(paste0("input ", failed, " failed"))
result

> print(paste0("input ", failed, " failed"))
[1] "input 2 failed"
> result
[1]  6.146264 21.163196
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...