在R中,我需要在循环中完成一个集合,但有时计算会产生警告,我想要通过警告去除任何结果,因此最终结果将没有任何带警告的元素。例如:
result <- numeric(10)
for (i in 1:length(result)){
element <- sample(-1:1,1)
result[i] <- log(element)
}
您可以看到element=-1
,log(element)=NaN
,NaN
何时仍会存储到result
,而R会发出警告。我只是想根据警告避免将NaN
存储到result
。这是一个简单的情况,我们可以有其他选择。但我必须面对的情况要复杂得多。所以我希望我能找到一种方法,如果发生了警告,那么我们将通过警告来消除计算结果。
答案 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)
的情况相对应,并且在没有警告的情况下生成。