在循环中使用警告删除迭代

时间:2015-08-15 07:30:47

标签: r loops warnings

在R中,我需要在循环中完成一个集合,但有时计算会产生警告,我想要通过警告去除任何结果,因此最终结果将没有任何带警告的元素。例如:

result <- numeric(10)
for (i in 1:length(result)){
 element <- sample(-1:1,1)
 result[i] <- log(element)
}

您可以看到element=-1log(element)=NaNNaN何时仍会存储到result,而R会发出警告。我只是想根据警告避免将NaN存储到result。这是一个简单的情况,我们可以有其他选择。但我必须面对的情况要复杂得多。所以我希望我能找到一种方法,如果发生了警告,那么我们将通过警告来消除计算结果。

1 个答案:

答案 0 :(得分:2)

您可以尝试使用tryCatch()并将其与递归相结合,以避免出现警告消息和NaN条目:

set.seed(222) # for reproducibility of the pseudo-random results
set_to_log <- function() {
  element <- sample(-1:2,1)
  tryCatch(log(element), warning = function(w) set_to_log())
}
result <- numeric(10)
for (i in 1:length(result)){
  result[i] <- set_to_log()
}
#> result
# [1] 0.6931472      -Inf 0.6931472 0.6931472      -Inf      -Inf 0.0000000      -Inf 0.0000000 0.6931472

此处,function(w)指定在出现警告时应再次调用函数set_to_log(),如果生成NaN结果,则会发生此警告。通过对此递归使用tryCatch(),代码不会发出任何警告,向量result将不包含任何NaN条目。但是,result向量可能包含-Inf条目,这些条目与log(0)的情况相对应,并且在没有警告的情况下生成。