【问题标题】:Pipe R commands and results from within a for loop to a file将 for 循环中的 R 命令和结果通过管道传输到文件
【发布时间】:2011-01-04 13:39:21
【问题描述】:

我们希望将 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,但我只需要一个文本文件,没有任何格式。

【问题讨论】:

    标签: logging r loops pipe


    【解决方案1】:

    我建议不要考虑

    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)等等。

    【讨论】:

      【解决方案2】:

      一些想法:

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

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

      for 循环的开始处。


      正如 juba 指出的那样,在这种情况下,您似乎不需要 for 循环 - 矢量化或 apply 会更好。


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


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

      【讨论】:

      • 我同意,截断是 R 的标准并节省纸张,但我的报告需要完整的源代码。说到,R 代码可以向量化,但算法来自材料测试标准,并且在 for 循环中实现时更容易理解(对于报告阅读器)。最后,我尝试了 Sweave:它的效果比我想象的要好得多,而且 LaTeX 输出看起来很棒。
      【解决方案3】:

      我不确定你到底想要什么,特别是为什么你想把源代码放在你的文本文件中。

      首先,我最好使用 *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>

      【讨论】:

      • 我需要的是可以打印并附加到文档的文本报告。该报告应包含数据框、源代码和结果,以允许手动检查结果。 lapply(cData,myfunc) 可以工作,但如果 myfunc 包含任何条件(for,if ...),则 for/if 内的代码的打印输出将被截断,例如: > myfunc 5) + { + variance # results as a list > lapply(cData, myfunc) $c1... 感谢您的帮助。
      猜你喜欢
      • 1970-01-01
      • 2018-01-25
      • 1970-01-01
      • 2018-08-18
      • 1970-01-01
      • 1970-01-01
      • 2020-02-16
      • 2011-06-28
      • 2014-12-01
      相关资源
      最近更新 更多