如何捕获CLI工具文件输出到R对象或STDUUT?

如何捕获CLI工具文件输出到R对象或STDUUT?,r,pipe,latex,command-line-interface,system,R,Pipe,Latex,Command Line Interface,System,我正在调用一系列命令行界面(CLI)工具(例如R脚本或从R脚本中调用),我希望直接将这些工具的输出文件捕获为R对象,而不必触及文件系统 这与更常见的“how-do-I-redirect-stdout-to-file”问题正好相反(这可能意味着我“使用错误”) 示例: 比如说,我有一个简单的latexreprex.tex文件,我想编译它: \documentclass{article} \begin{document} Foo. \end{document} 在R中,我可以使用tools

我正在调用一系列命令行界面(CLI)工具(例如R脚本或从R脚本中调用),我希望直接将这些工具的输出文件捕获为R对象,而不必触及文件系统

这与更常见的“how-do-I-redirect-stdout-to-file”问题正好相反(这可能意味着我“使用错误”)

示例

比如说,我有一个简单的latex
reprex.tex
文件,我想编译它:

\documentclass{article}

\begin{document}

Foo.


\end{document}
在R中,我可以使用
tools::texi2pdf()
包装器,也可以自己发送命令将其编译成pdf

在外壳上,简单地说:

texi2pdf reprex.tex
等价地,从R调用:

reprex_as_pdf <- system2(command = "texi2pdf", args = c(reprex.tex), stdout = TRUE, stderr = TRUE)

你会问,为什么会有人想这样做

我通常害怕副作用和跨机器/操作系统的文件系统恶作剧,希望将副作用隔离到很少的功能中。 此外,pdf实际上将以编程方式导出,并在各种不同的函数中进行转换。 最后,我需要很多这样的PDF,我希望它们在部署到可能没有
texi2dvi
的服务器之前能够轻松编译和缓存


如果我完全“用错了”,请阻止我。

简单地说:在一般情况下,您不能。但有时这些工具允许您指定输出文件,在这种情况下,您可以(在某些系统上,但请注意这是不可移植的)指定
/dev/stdout
作为输出文件

根据
texi2pdf
手册页,以下内容应适用:

reprex_as_pdf <- system2(
    command = "texi2pdf",
    args = c("reprex.tex", "-o", "/dev/stdout"),
    stdout = TRUE, stderr = TRUE
)

reprex\u as\u pdf与相关,但不是重复,我希望在不接触文件系统的情况下直接捕获
knitr::knit()的输出。
knit()
是原生的R,因此这是另一个问题。在python中,您可以将字符串缓冲区附加到进程的标准输出:。我不知道R。另外请注意,在Linux上写入
/tmp
时,通常不会命中磁盘(参见)。内容完全保留在RAM中。因此性能可能相当好,尽管我同意这很麻烦。我想我将不得不在某个时候学习Python。哦,我忘了:对于输入文件,类似地,您可能可以使用
/dev/stdin
。但是,如果工具尝试从stdin读取命令,这可能会以奇怪的方式出现读取输入文件。
reprex_as_pdf <- system2(
    command = "texi2pdf",
    args = c("reprex.tex", "-o", "/dev/stdout"),
    stdout = TRUE, stderr = TRUE
)