【问题标题】:R: is there a command for the end of a file that states whether any errors occurred?R:是否有一个文件结尾的命令来说明是否发生了任何错误?
【发布时间】:2012-02-18 00:42:04
【问题描述】:

有时当我运行很多长程序时,我认为如果有一个语句或命令可以添加到文件底部来告诉我 R 是否返回任何错误消息(或警告消息)而运行文件。

我总是向上滚动所有代码以直观地检查错误消息或警告,并一直认为如果 R 只是在代码底部告诉我是否发生任何错误消息或警告会很好。

R 能做到吗?我想即使 R 可以做到这一点,我也需要一段时间来建立对命令行的信任以捕获所有错误消息或警告消息。

对于 SAS,我曾经使用 find 命令并在日志窗口中搜索单词“错误”或“警告”。

感谢您对此提出任何想法或建议。

这是一个非常简单的 R 代码示例,它返回 3 条错误消息。

x <- c(1,2,3,4)
y <- c(3,4)
z <- x / y
zz
a <- matrix(x, nrow=2, byrow=T)
b <- matrix(x, nrows=2, byrow=T)
z x a
z * a

【问题讨论】:

  • 我不是很清楚你是如何运行这段代码的(它是一个脚本,你来源的文件,等等?)但你可以看看 options() 的“错误”组件.看看 ? 选项。您可以使用增加计数器的函数重新定义它,然后在脚本末尾返回计数器的值。
  • 我通常在文本编辑器中编写所有 R 代码。完成 R 代码后,我将其复制,打开 R 并将所有代码一次性粘贴到 R 中。我一定会看看选项“命令”。谢谢。

标签: r error-handling


【解决方案1】:

我假设您是从 GUI 运行的,其中错误不是致命的。这是一个使用选项(错误)的解决方案。错误处理程序被一个递增变量的函数替换:

.error.count <- 0
old.error.fun <- getOption("error")
new.error.fun <- quote(.error.count <- .error.count + 1)
options(error = new.error.fun)

### your code here ###
x <- c(1,2,3,4)
y <- c(3,4)
z <- x / y
zz
a <- matrix(x, nrow=2, byrow=T)
b <- matrix(x, nrows=2, byrow=T)
z x a
z * a
######################

cat("ERROR COUNT:", .error.count, "\n")
options(error = old.error.fun)
rm(.error.count, old.error.fun, new.error.fun)

【讨论】:

  • 所有这些答案看起来都非常有帮助。我会研究他们每个人。谢谢。
【解决方案2】:

这不是一个很好的例子,因为当我运行它时,它会在第一个错误时停止。但是,操作系统和标准文件描述符可能会更好地解决一般问题。具体来说,R 会将其正常输出输出到 stdout,并将其警告和错误输出到 stderr,您可以单独处理这些流,而不是一起查看它们。例如,您可以将 stdout 发送到文件并将 stderr 保留在终端中:

Rscript myfile.R 1>output.txt

【讨论】:

  • 谢谢。我会看看的。
【解决方案3】:

我主要通过使用source() 运行代码来获得此功能;即,只需将代码转储到文件中,然后运行:

source("yourscript.r")

在 R 中,返回:

Error in source("yourscript.r") : yourscript.r:7:3: unexpected symbol
6: b <- matrix(x, nrows=2, byrow=T)
7: z x
     ^

它不会一次返回所有错误 - 语法错误将完全停止文件执行,这与 checkorbored 的 Rscript 方法不同,该方法运行然后给出第一个错误(有关更多详细信息,请参阅?source)。但它可能符合您的目的。

【讨论】:

    【解决方案4】:

    类似于@checkorboard

    我所做的是将代码放在一个文本文件中,说“yourscript.r”然后运行:

    R CMD BATCH yourscript.r &
    

    这将使用程序的输出自动创建一个类似于 yourscript.rout 的文件,您可以轻松地grep 来查看是否有错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-15
      • 2010-11-09
      • 2016-01-25
      相关资源
      最近更新 更多