我们希望将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,但我只需要一个文本文件,没有格式化。
答案 0 :(得分:2)
我建议不要考虑
source("myscript.r",echo=TRUE)
而是Rscript
(随R一起提供)
Rscript myscript.r # on windows, linux or os x
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()
无论如何,我不知道这些输出中的一个是否是您正在寻找的。 p>
答案 2 :(得分:0)
一些想法:
循环之后的结果是R提供输出的标准方式 - 这是因为R在表达式完成之前不执行循环。这不是sink
特有的问题。要查看此内容,请执行除sink
命令之外的所有代码段(以便输出转到R控制台),您将看到相同的效果。为清楚起见,您可以添加一行
cat("Results for iteration", i, "\n")
在for
循环开始时。
正如朱巴指出的那样,在这个例子中你似乎不需要for
循环 - 矢量化或apply
会更好。
在R中将代码和输出组合成某种形式的报告的标准方法是使用Sweave
。这将创建Latex标记,然后您可以将其编译为PDF或PostScript文档(一旦您设置了一些Latex工具,只需要相当少的努力)。这样做的明显优势在于您也可以包含数字。
编辑:混合文本和代码报告还有brew
package。