TL; DR:我使用sink()在脚本运行期间记录错误,并将它们保存到可在运行后查看的数据框中,以突出显示错误。如果可能的话,我想要一种包含错误行号的方法。
'
长版本:我正在编写一个R脚本来处理国家天气数据集,这些数据集有时包含异常 - 缺少数据,意外符号等。数据中的不一致可能会导致错误。脚本,这对程序员来说很好 - 我可以识别并修复它们。然而,我最终的目标是使其广泛适用于任何国家天气数据集 - 这意味着它可能被具有很少R知识的人使用。该脚本目前约有700行,并且将会有更长的时间,具有许多用户定义的功能。这使得查看控制台历史记录相当繁琐,特别是对于新手R用户。
到目前为止,我的解决方案是将脚本运行期间生成的所有错误和警告消息保存到表中,这是用户在运行后看到的第一件事,强制他们确认错误。我正在使用sink()函数(我在另一个SO帖子上找到了这个方法,在下面的代码注释中找到了),并且它工作得很漂亮,除了我无法找到一种记录线的方法错误消息的编号。 Traceback()在这种情况下不会工作,因为我想要所有错误,而不仅仅是堆栈中最新的错误。
如上所述,我的代码如下。我主要在RStudio工作,所以我通过将块粘贴到控制台来运行它。
# Method accesed online Nov 24, 2016, at:
# http://stackoverflow.com/questions/11666086/output-error-warning-log-txt-file-when-running-r-script-under-command-line
setwd(tempdir()) # tempdir() creates names for temporary files
# Capture messages and errors to a file
zz=file("all.Rout",open="wt") # file() creates a file connection and opens it
# in wt="write text mode".
sink(zz,type="message") # sink diverts R output to a connection - in this case, the error log, zz
# test out some error samples (4)
try(log("a")) # try runs an expression and allows user code to handle error-recovery
z x a # try() is not necessary - any error will be flagged and entered to the log
mean()
sds(42)
# Display log file
readLines("all.Rout")
error.log=data.frame(readLines("all.Rout")) # write these to an error log DF
# Reset sink, close connection
sink(type="message") # this prevents diversion of messages -
# they will now appear in console, as default
close(zz) # close the error log connection
remove(zz) # blank from mem
# OK, this is good - but can I get line numbers to output to the DF?
有人可以推荐一种方法来使用sink()吗?
或者,如果您知道其他方式来获取我想要的输出(错误/警告信息列表/表及其在代码中的位置),我全心全意。