从 R 保存文本的方法比较:writeLines()、cat() 和 sink()

Ric*_*son 7 r

这个问题,将文本行写入 R 中的文件,显示了将输出保存到纯文本文件的三种不同方式。使用问题中的示例,假设我们要创建一个output.txt以此文本命名的文件:

Hello
World
Run Code Online (Sandbox Code Playgroud)

问题的答案显示了三种方法:

  1. 使用writeLines()
Hello
World
Run Code Online (Sandbox Code Playgroud)
  1. 使用sink()
fileConn<-file("output.txt")
writeLines(c("Hello","World"), fileConn)
close(fileConn)
Run Code Online (Sandbox Code Playgroud)
  1. 使用cat()
sink("outfile.txt")
cat("hello")
cat("\n")
cat("world")
sink()
Run Code Online (Sandbox Code Playgroud)

一些答案和评论指出,这cat()会比其他两种方法慢。然而,我的问题是:

  1. 是否存在一种方法比其他方法更好的情况?
  2. 如果一种方法比 R 中的其他两种方法更惯用正确或更快,为什么?

我搜索了所以只找到了链接的答案。我在 SO 上发现了其他为什么问题(例如,为什么处理排序数组比处理未排序数组更快?)所以我认为这个问题是该网站的主题。

Wal*_*ldi 4

简短的性能比较显示出明显的优势writeLines

system.time(writeLines(con = 'writeLines.txt',text = paste('Line ',1:100000)))
#>        user      system       total 
#>        0.17        0.01        0.18

system.time(cat( paste('Line ',1:100000),file="cat.txt",sep="\n"))
#>        user      system       total 
#>        0.25        0.85        1.11
Run Code Online (Sandbox Code Playgroud)

查看 C 代码,cat使用RPrintf位于builtin.c中。

R 中的所有打印都是通过函数 Rprintf 和 REprintf 或其 (v) 版本 Rvprintf 和 REvprintf 完成的。
这些例程的工作方式与 (v)printf(3) 完全相同。Rprintf 写入“标准输出”。
它由sink()函数重定向

如上所述,使用sink()允许重定向连接。使用重定向一次到文件sink()肯定比打开新连接/附加数据/关闭每个新行(如使用cat(file=..., append=TRUE).

writeLinesRconn_printf使用位于connections.c中的专用C 函数并且速度更快。

总结 :

  • cat是控制台的标准 R 输出
  • sink允许将cat输出重定向到另一个连接,例如文件,允许写入多行而无需重新打开连接
  • writeLinessink+cat比文件输出更快

建议,何时使用哪个:

  • 我喜欢cat()在控制台模式下记录 R 脚本进度。验证脚本后,sink()如果需要,允许将此输出重定向到文件,并且可能对脚本自动化有用。
  • writeLines()当我特别想将数据(而不仅仅是日志)写入文件时,我会使用它,因为它具有更好的性能。