2015-08-15 79 views
1

在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。这是一个容易的情况,我们可以有其他选择。但我不得不面对的情况要复杂得多。所以我希望能找到一种方法,如果发生了警告,那么我们将通过警告来计算结果。

回答

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)的情况并且在没有警告的情况下生成。

+0

RHertel,谢谢你的回复。 'tryCatch()'看起来像我应该使用的函数。唯一的问题是我不想跳过任何迭代,我只想确保结果向量中的所有元素都没有任何警告消息。在你的例子中,如果我的理解是正确的,有用的结果会少于10? – user17670

+0

您需要决定在“NaN”情况下应该存储在向量中的内容。当您尝试取负数的对数时,这种情况会发生在您的示例中。在这种情况下,结果没有定义。什么应该存储在向量中?如果'NaN'可以作为向量中的条目,但是只是在脚本运行时打印的警告令您感到不安,则可以使用'try(result [i] < - log(element),silent = TRUE)'(在这种情况下,警告将在脚本运行之后被打印*)。 – RHertel

+0

对此感到抱歉。当生成'NaN'时,我只想运行'element < - sample(-1:1,1);结果[i] < - log(element)',直到没有任何警告产生的结果。我正在尝试使用一些“while”循环来实现我的目标。 – user17670