2012-01-24 25 views
3

似乎很少有关于这方面的文档(除非我看错了地方!)。我在Unix上运行命令行上R:.RHistory并保存所有警告()

R --no-save <myfile1.r>& out1.txt 

如果我同时运行几个R取代的脚本,我必须把savehistory("history1.Rhistory")等在每个文件的结尾,或者可以在.Rhistory的名字文件在命令行参数中给出?

我还假设所有警告都保存在R工​​作区中;然而,似乎只有最后50个可见(There were 50 or more warnings (use warnings() to see the first 50)) - 有没有办法保存所有警告?

+0

我想你想使用这种脚本 –

+2

的RSCRIPT而不是R如果只运行一个脚本,当然历史也只是'源( myfile1.r)'。你为什么需要保存? –

+0

对不起 - 我没有说清楚;我其实是指如何保存工作区,而不是历史!那会教我不校对的问题...... – ChrisW

回答

3

我还以为所有的警告都保存在R工​​作区

都能跟得上。从?warnings

It is undocumented where ‘last.warning’ is stored nor that it is 
visible, and this is subject to change. Prior to R 2.4.0 it was 
stored in the workspace, but no longer. 

自那时以来,undocumentedly被存储在baseenv()变量last.warning,但不依赖于总是如此。 (另请注意,如果尚未发出警告,则该变量不存在。)您应该使用warnings()来访问最后的警告。

有没有办法保存所有警告?

不明显。这个理论是50个警告一次就足够让人担心了。如果您认为警告是错误的,请阅读前50个问题并修复问题或将错误代码包装到suppressWarnings中,然后处理下一个问题。

3

如果你想要保存所有的警告,也许是外部文件,你可以打包你正在执行的代码withCallingHandlers()。它允许你为警告条件定义一个'处理程序'。处理程序是每次遇到警告时运行的函数;您可以使用它来完成您希望通过传递警告消息的任何内容。 (关于此主题的优秀简介,请参阅Martin Morgan对this SO question的回答。)

在此,我定义了一个处理程序:(a)将警告消息附加到文件; (b)使用invokeRestart()进行警告发生地点的功能评估。可以很明显的修改,使之适合您的具体需求:

# DEFINE A WRAPPER FUNCTION THAT: 
# - EVALUATES A GIVEN EXPRESSION 
# - SAVES ALL WARNINGS TO A LOGFILE 
saveAllWarnings <- function(expr, logFile="warning_log.R") { 
    withCallingHandlers(expr, 
     warning=function(w) { 
      cat(conditionMessage(w), "\n\n", file=logFile, append=TRUE) 
      invokeRestart("muffleWarning") 
     }) 
} 

# TRY IT OUT WITH A MADE UP FUNCTION THAT THROWS SEVERAL WARNINGS 
messyFun <- function() { 
    warning("oops") 
    warning("boops") 
    warning("can't I get anything right?") 
    1 
} 

saveAllWarnings(messyFun(), logFile="messyFun warning log.R")