管道R命令和从for循环到文件的结果

时间:2010-01-13 09:42:16

标签: logging r loops pipe

我们希望将R脚本的命令和结果记录到文本报告文件中。文本文件中的管道适用于sink(),但不适用于for循环。

使用

调用脚本
source("myscript.r",echo=TRUE)

我们需要循环将data.frame的所有行连续提取到矢量中,并使用每个矢量进行基于矢量的分析。 这是一个简短的例子:

#pipe output to file
sink("myfile.txt",append=TRUE,split=TRUE)
#some data
c1<-rnorm(10,mean=90,sd=10) 
c2<-rnorm(10,mean=75,sd=8)
c3<-rnorm(10,mean=98,sd=12)
#data in a data.frame
cData<-data.frame(c1,c2,c3)
#print data.frame
cData  
#loop over frame 
for (i in 1:ncol(cData))  
{
  #extract vector
  x<-cData[,i]
  #do something with vector
  n = length(x)
  #... more code
  #print result
  print(n)    
}
#close output
sink()

我尝试使用sink()txtStart()sink()截断命令并在循环后放置结果,txtStart()似乎重复命令但不重复结果。

我也看了brew,但我只需要一个文本文件,没有格式化。

3 个答案:

答案 0 :(得分:2)

我建议不要考虑

source("myscript.r",echo=TRUE)

而是Rscript(随R一起提供)

Rscript myscript.r     # on windows, linux or os x

littler

r myscript.r           # on linux or os x

这使您能够查询命令行参数(通过CRAN包getopt和optparse)等等。

答案 1 :(得分:0)

我不确定你究竟想要什么,尤其是你想把源代码放在文本文件中的原因。

首先,我最好使用* apply系列函数来浏览数据框而不是for循环,尤其是lapply和sapply。

使用以下代码,您将获得三种不同的输出演示。第一个应该与您的代码相似。第二个和第三个有点不同,它们将值输出为列表或数据帧。

sink("/tmp/myfile.txt", append=TRUE, split=TRUE)

myfunc <- function(v) {
  variance <- var(v)
  mean <- mean(v)
  return(list(variance=variance,mean=mean))
}

myotherfunc <- function(v) {
  cat("And the mean is:\n")
  print(mean(v))
  cat("And the variance is:\n")
  print(var(v))
}

# results printed directly
invisible(lapply(cData, myotherfunc))

# results as a list
lapply(cData, myfunc)

# results as a data frame
sapply(cData, myfunc)


sink()

无论如何,我不知道这些输出中的一个是否是您正在寻找的。

答案 2 :(得分:0)

一些想法:

循环之后的结果是R提供输出的标准方式 - 这是因为R在表达式完成之前不执行循环。这不是sink特有的问题。要查看此内容,请执行除sink命令之外的所有代码段(以便输出转到R控制台),您将看到相同的效果。为清楚起见,您可以添加一行

cat("Results for iteration", i, "\n")

for循环开始时。


正如朱巴指出的那样,在这个例子中你似乎不需要for循环 - 矢量化或apply会更好。


在R中将代码和输出组合成某种形式的报告的标准方法是使用Sweave。这将创建Latex标记,然后您可以将其编译为PDF或PostScript文档(一旦您设置了一些Latex工具,只需要相当少的努力)。这样做的明显优势在于您也可以包含数字。


编辑:混合文本和代码报告还有brew package