将任意数量的警告消息压缩为一个

问题描述 投票:0回答:1

来自

?options
warn
的描述说

如果发出了 10 个或更少的警告,则会打印它们,否则会显示一条消息,说明发出了多少个警告。

因此,如果警告超过 10 条,它们将被压缩为 1 条消息。例如:

f <- function() {
  warning("warn 1")
  warning("warn 2")
  warning("warn 3")
  warning("warn 4")
  warning("warn 5")
  warning("warn 6")
  warning("warn 7")
  warning("warn 8")
  warning("warn 9")
  warning("warn 10")
  warning("warn 11")
  return(1)
}

f()

[1] 1
有 11 个警告(使用 warnings() 查看它们)

如何将 10 的限制减少到 1? IE。即使我只有一个警告,我也希望它能显示出来

有 1 个警告(使用 warnings() 查看它们)

r warnings
1个回答
0
投票

找不到全局降低此阈值的选项。相反,您可以使用包装函数在需要时总结警告。

> f <- \(n) {
+   replicate(n, warning('foo'))
+   return(1)
+ }
> 
> W <- function(FUN) {
+   n <- 0
+   res <- withCallingHandlers({
+     FUN
+   }, warning = function(w) {
+     wrn <- warnings()
+     n <<- n + length(wrn)
+     invokeRestart("muffleWarning")
+   })
+   more <- (n > 1L) + 1L
+   msg <- sprintf('There %s %s warning%s (use warnings() to see %s)',
+                  switch(more, 'was', 'were'),
+                  n,
+                  switch(more, '', 's'),
+                  switch(more, 'it', 'them')
+   )
+   message('Warning: ', msg)
+   res
+ }
> W(f(1))
Warning: There was 1 warning (use warnings() to see it)
[1] 1
> W(f(11))
Warning: There were 11 warnings (use warnings() to see them)
[1] 1
© www.soinside.com 2019 - 2024. All rights reserved.