我想生成一个记录所有命令( stdin ),结果( stdout )和错误/警告/消息()的日志文件在R控制台中的stderr 。
我知道有很多日志包,我尝试了几个像TeachingDemos
(似乎完全忽略了stderr)或R2HTML
(似乎忽略了消息),但是,没有一个似乎包含了来自 stderr 的所有内容。
只有knitr
和markdown
似乎能够将所有内容都包含在一个文件中。但是使用这种解决方法,我必须编写R脚本,我无法在控制台中自由编写命令。
此外,我不能在同一个R脚本中包含knitr
或markdown
命令(这当然是一个小问题)。
以下是一个示例:
library(TeachingDemos)
library(R2HTML)
library(TraMineR)
logdir <- "mylog.dir"
txtStart(file=paste(logdir,"test.txt", sep=""), commands=TRUE,
results=TRUE, append=FALSE)
HTMLStart(outdir = logdir, file = "test", echo=TRUE, HTMLframe=FALSE)
## Messages, warnings and errors
message("Print this message.")
warning("Beware.")
"a" + 1
geterrmessage()
## Some example application with the TraMiner package
## which uses messages frequently
data(mvad)
mvad.seq <- seqdef(mvad[, 17:86])
mvad.ham <- seqdist(mvad.seq, method="HAM")
txtStop()
HTMLStop()
答案 0 :(得分:7)
如果您从Unix / Linux / Mac /等运行R。终端,你可以这样做:
R | tee mydir/mylog.txt
在Windows上,您可以在
中运行脚本R CMD BATCH yourscript.R
,您的结果将显示在与yourscript.out相同的文件夹中
答案 1 :(得分:1)
在unices上,我经常使用以下代码习惯用bash:
Some Command 2>&1 | tee NameOfOutputFile.txt
&#34; 2&gt;&amp; 1&#34;说采取stderr并将其重定向到stdout,然后通过管道传送到&#34; tee&#34;。我将尝试使用此方法和其他记录R会话的方法。
另一个unix技巧是&#34;脚本&#34;命令,它启动一个子shell,其I / O(基本上你输入并查看的所有内容)都会记录到指定的文件中。然后退出shell以结束脚本。再次,接受实验。因为&#34;沉没&#34; R是原生的,我会先尝试。
顺便说一下,我使用solaris选择了这些技巧,但是它们运行的是同样的运行Cygwin,即Windows上的unix模拟器。很久以前,我发现我的Cygwin图像比Solaris的机构安装更新,因为管理员除了让Solaris保持最新之外还有更多的责任。请注意,机构机器更强大,所以即使Cygwin更方便,我的个人机器根本无法满足需求。
所感:
我从Dustin's Analyzers的第99页获取了示例代码。以下是测试文件palette.R的内容:
r
plot(gnp)
acf2(gnp, 50)
gnpgr = diff(log(gnp)) # growth rate
plot(gnpgr)
acf2(gnpgr, 24)
sarima(gnpgr, 1, 0, 0) # AR(1)
sarima(gnpgr, 0, 0, 2) # MA(2)
ARMAtoMA(ar=.35, ma=0, 10) # prints psi-weights
quit("no")
exit
我使用:
调用它脚本&lt; palette.R
它捕获来自palette.R的命令和相应的输出。因此,似乎可用于批处理模式。对于交互式模式,我将使用我的原始计划并使用接收器。
答案 2 :(得分:0)
我遇到了类似的问题,就我而言,我无法将输出真正所有重定向到我的日志文件中,因为它依赖于在 <强>交互模式。
具体来说,在我的日志文件中,我希望能够跟踪 rjags::update()
函数生成的进度条,但是需要交互模式:
如果progress.bar 为“none”或NULL,则进度条被抑制,如果 更新少于 100 次迭代,或者如果 R 未运行 互动。
因此,我需要让 R 认为它是交互式运行的,而实际上它是使用 此处文档从 bash 脚本(interactive_R.sh,下面)运行的:
#!/bin/bash
R --interactive << EOT
# R code starts here
print(interactive())
quit("no")
# R code ends here
EOT
(旁注:确保避免在 R 代码中使用 $
字符,因为这将无法正确处理 - 例如,使用 data.frame()
从 df[["X1"]]
检索列而不是 df$X1
。)
然后您可以简单地运行此脚本并使用以下 bash 命令将其内容发送到日志文件中:
$ ./interactive_R.sh > outputFile.log 2>&1
您的日志文件将如下所示:
R version 4.0.2 (2020-06-22) -- "Taking Off Again"
Copyright (C) 2020 The R Foundation for Statistical Computing
Platform: x86_64-conda_cos6-linux-gnu (64-bit)
R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.
Natural language support but running in an English locale
R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.
Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.
>
> # R code starts here
> print(interactive())
[1] TRUE
> quit("no")