R语言 在运行时在lapply Package 中打印消息

p8h8hvxi  于 2023-02-06  发布在  其他
关注(0)|答案(1)|浏览(111)

我有一个有条件地打印消息/警告的函数,例如:

test <- function(x)
{
  for (i in 1:5)
  {
    if (i == 3)
    {
      warning("test")
      break()
    }
    if (i != 3)
    {
      message(i)
    }
  }
}

该函数正确地跳出索引3并打印警告。

test(1)

1
2
Warning message:
test

但是,当我将该函数封装到lapply中时,警告消息只在末尾显示:

lapply(1:2, test)

1
2
1
2
[[1]]
NULL

[[2]]
NULL

Warning messages:
1: In FUN(X[[i]], ...) : test
2: In FUN(X[[i]], ...) : test

我如何确保“按循环”打印消息?即

1
2
Warning messages:
1: In FUN(X[[i]], ...) : test
1
2
Warning messages:
1: In FUN(X[[i]], ...) : test

[[1]]
NULL

[[2]]
NULL
bq8i3lrv

bq8i3lrv1#

您可以使用options(warn = 1)全局设置即时警告。warning()还有一个immediate.参数用于特定用途:

test <- function(x)
{
  for (i in 1:5)
  {
    if (i == 3)
    {
      warning("test", immediate. = TRUE)
      break()
    }
    if (i != 3)
    {
      message(i)
    }
  }
}

lapply(1:2, test)
1
2
Warning in FUN(X[[i]], ...) : test
1
2
Warning in FUN(X[[i]], ...) : test
[[1]]
NULL

[[2]]
NULL

文档注解:
warning通过(有效地)调用signalCondition来发出警告条件信号。如果没有处理程序或所有处理程序都返回,则使用warn = getOption(“warn”)的值来确定适当的操作。如果warn为否定,则忽略警告;如果为零,则在顶层功能完成之后存储并打印它们;如果是1,则在发生时打印,如果是2(或更大),则将警告转换为错误。调用warning(immediate. = TRUE)将warn〈= 0转换为warn = 1,仅用于此调用。

相关问题