如何将所有控制台输出保存到R中的文件?

时间:2011-08-17 17:32:44

标签: file r console logging

我想将所有控制台文本重定向到文件。这是我试过的:

> sink("test.log", type=c("output", "message"))
> a <- "a"
> a
> How come I do not see this in log
Error: unexpected symbol in "How come"

以下是我在test.log中的内容:

[1] "a"

这是我在test.log中想要的:

> a <- "a"
> a
[1] "a"
> How come I do not see this in log
Error: unexpected symbol in "How come"

我做错了什么?谢谢!

9 个答案:

答案 0 :(得分:83)

您必须单独下沉“输出”和“消息”(sink功能仅查看type第一个元素

现在,如果你想要记录输入,那么把它放在一个脚本中:

script.R

1:5 + 1:3   # prints and gives a warning
stop("foo") # an error

并在提示符处:

con <- file("test.log")
sink(con, append=TRUE)
sink(con, append=TRUE, type="message")

# This will echo all input and not truncate 150+ character lines...
source("script.R", echo=TRUE, max.deparse.length=10000)

# Restore output to console
sink() 
sink(type="message")

# And look at the log...
cat(readLines("test.log"), sep="\n")

答案 1 :(得分:9)

如果您可以访问命令行,则可能更喜欢使用R CMD BATCH从命令行运行脚本。

==开始script.R ==

的内容
a <- "a"
a
How come I do not see this in log

==结束script.R ==

的内容

在命令提示符处(&#34; $&#34;在许多un * x变种中,&#34; C:&gt;&#34;在Windows中),运行

$ R CMD BATCH script.R &

尾随&#34;&amp;&#34;是可选的,在后台运行命令。 日志文件的默认名称为&#34; out&#34;附加到扩展名,即script.Rout

==开始script.Rout ==

的内容
R version 3.1.0 (2014-04-10) -- "Spring Dance"
Copyright (C) 2014 The R Foundation for Statistical Computing
Platform: i686-pc-linux-gnu (32-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.

[Previously saved workspace restored]

> a <- "a"
> a
[1] "a"
> How come I do not see this in log
Error: unexpected symbol in "How come"
Execution halted

==结束script.Rout ==

的内容

答案 2 :(得分:3)

你做不到。最多可以使用sink保存输出,并分别使用savehistory输入。或者使用scriptscreentmux等外部工具。

答案 3 :(得分:1)

使用ESS(Emacs Speaks Statistics)r-mode在emacs中运行R.我有一个窗口打开我的脚本和R代码。另一个有R跑。代码从语法窗口发送并进行评估。命令,输出,错误和警告都出现在正在运行的R窗口会话中。在某个工作期结束时,我将所有输出保存到文件中。我自己的命名系统是脚本的* .R和保存输出文件的* .Rout。 这是一个带有示例的屏幕截图。Screenshot writing and evaluating R with Emacs/ESS.

答案 4 :(得分:1)

您可以打印到文件,并同时在运行R脚本时查看进度是否为screen

不使用屏幕时,请使用R CMD BATCH yourscript.R &并执行步骤4。

  1. 使用屏幕时,请在终端中启动屏幕

     screen
    
  2. 运行您的R脚本

     R CMD BATCH yourscript.R
    
  3. Ctrl A ,然后按 c

    转到另一个屏幕
  4. (实时)查看输出:

     tail -f yourscript.Rout
    
  5. 使用 Ctrl A 然后选择 n

    在屏幕之间切换

答案 5 :(得分:0)

如果能够使用bash shell,可以考虑从bash脚本中简单地运行R代码,并将stdout和stderr流传递给文件。以下是使用heredoc的示例:

档案:test.sh

#!/bin/bash
# this is a bash script
echo "Hello World, this is bash"

test1=$(echo "This is a test")

echo "Here is some R code:"

Rscript --slave --no-save --no-restore - "$test1" <<EOF
  ## R code
  cat("\nHello World, this is R\n")
  args <- commandArgs(TRUE)
  bash_message<-args[1]
  cat("\nThis is a message from bash:\n")
  cat("\n",paste0(bash_message),"\n")
EOF

# end of script 

然后当你运行脚本时,stderr和stdout都通过管道传输到日志文件:

$ chmod +x test.sh
$ ./test.sh
$ ./test.sh &>test.log
$ cat test.log
Hello World, this is bash
Here is some R code:

Hello World, this is R

This is a message from bash:

 This is a test

要考虑的其他事情是尝试简单地将stdout和stderr从R heredoc直接写入日志文件;我还没有尝试过,但它也可能会有用。

答案 6 :(得分:0)

要从控制台保存文本:运行分析,然后选择(Windows)&#34;文件&gt;保存到文件&#34;。

答案 7 :(得分:0)

为大量行设置Rgui首选项,然后设置时间戳并以适当的间隔保存为文件。

答案 8 :(得分:0)

如果您要获取错误消息

zz <- file("Errors.txt", open="wt")
sink(zz, type="message")

输出将是:

Error in print(errr) : object 'errr' not found
Execution halted

此输出将保存在名为Errors.txt的文件中

如果要将控制台的打印值存储到文件中,可以使用'split'参数:

zz <- file("console.txt", open="wt")
sink(zz,  split=TRUE)
print("cool")
print(errr)

输出将是:

[1] "cool"

在console.txt文件中。因此,所有控制台输出都将打印在名为console.txt的文件中