【发布时间】:2017-07-26 09:20:38
【问题描述】:
我正在从 R 脚本调用一堆命令行界面 (CLI) 工具(例如 texi2pdf 或 pdf2svg,我想捕获输出文件这些工具中的直接作为 R 对象,不接触文件系统。
这是更频繁的“how-do-I-redirect-stdout-to-file”问题的相反问题。 (也许这意味着我“用错了”)。
示例:
说,我有一个简单的乳胶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)
很方便,system2() 允许我通过 stdout = TRUE 将 stdout/stderr 捕获为字符向量,这让我成功了一半。
但是,我似乎在texi2pdf manpage 中找不到任何可以让我将(二进制!)输出重定向到stdout(这样,重定向到system2())的内容。
如何在 R 中将texi2pdf 直接 的输出捕获为(原始)向量?
(奖励:我怎样才能将 input 作为 R 字符向量而不是文件传递给 texi2pdf?)
解决方法
我当然可以通过tempfile() 工作,但是会触及文件系统,而且看起来不优雅/麻烦。
library(readr)
system2(command = "texi2pdf",
args = c("reprex.tex"),
stdout = TRUE,
stderr = TRUE)
reprex_as_pdf <- read_file_raw("reprex.pdf")
为什么有人愿意这样做?
我通常害怕副作用和跨机器/操作系统文件系统的恶作剧,并希望将副作用隔离到极少数功能。
此外,pdf 实际上将以编程方式导出,转换为各种不同的功能。
最后,我需要 很多 个这些 pdf,我希望它们在部署到可能没有 texi2dvi 的服务器之前轻松编译和缓存。
如果我绝对“用错了”,请阻止我。
【问题讨论】:
-
与this question 相关,但与this question 不重复,我想在不接触文件系统的情况下直接捕获
knitr::knit()的输出。knit()虽然是原生 R,所以这是一个不同的问题。 -
在 python 中,您可以将字符串缓冲区附加到进程的标准输出:docs.python.org/2/library/stringio.html。我不了解 R。另外请注意,在 Linux 上写入
/tmp时,您通常不会点击磁盘(参见 en.wikipedia.org/wiki/Tmpfs#cite_note-4)。内容完全保留在 RAM 中。因此性能可以相当不错,虽然我同意这很麻烦。 -
我想我将在某个时候必须学习 Python ????
标签: r pipe latex command-line-interface system