警告消息行号 R

11

我有一个循环,循环了数百次,到最后会产生以下警告:

Warning messages:
1: In min(j, na.rm = TRUE) :
  no non-missing arguments to min; returning Inf

有没有办法询问 R 警告消息是在哪一行生成的?


楼下的评论: “我没有直接将 min 作为一行。它可能嵌套在其他函数中,否则我不会问这个问题,因为我知道这是一个来自 min 的问题。”


1
看起来你给函数 min() 输入了错误的参数。 - N8TRO
2
所有数据都是“NA”,这就是它的含义。尝试:min(rep(NA, 10), na.rm=T) - Arun
2个回答

16

你可以尝试设置:

options(warn = 2)

我建议将警告视为错误。这样,当您的代码在第一个警告处停止时,使用 traceback() 查看堆栈跟踪。

但这只对第一个警告有用。

要恢复默认行为,请使用:

options(warn = 0)

4
并不是真正的解决方案,更像是一个糟糕的权宜之计。我不知道为什么R会忽略行号,这让调试非常困难。 - Tomas
2
这对我不起作用。traceback() 返回“没有可用的回溯信息”。但是以下警告的 options(error=recover) 等效方法很有用:options(warning.expression=quote(recover())) - Harsh
1
有没有人能够指定一个直接的方法来定位警告的行号,而不是这个解决方法? - indra_patil
@Harsh,你提出的解决方案导致我的警告完全消失了。 - 3pitt

2
这是一个基本的for循环操作指南,与R无关。
在你的min代码行之前添加:
 print(paste("j is", j, "\n"))  # or instead of j, use i, or whichever index you are using     
 min(j, na.rm = TRUE) 

如果您能了解错误出现的位置,那就很好了。
至于更适用于 R 的解决方案,如果 j 来自数据框、矩阵、列表等,您需要找到哪个块(迭代部分)只包含 NA
您可以使用类似以下内容的语句:
  apply(myDF, 1, function(x) all(is.na(x)))

我没有直接的min代码行。它可能嵌套在其他函数中,否则我不会问这个问题,因为我知道这是来自min的问题。 - user1234440
在你最初的问题中提到这一点会更有帮助。如果是这种情况,那么你最好使用traceback(),就像@NPE建议的那样。 - Ricardo Saporta
@Tomas,这是对最初发布的问题的回答。请查看编辑历史记录。我将作为对此答案的评论留下的信息添加到了问题中。 - Ricardo Saporta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接