如何直接将针织到R对象?

3
我希望能够直接将knit()生成的文档以R对象的形式,即字符向量,存储在R中。我知道可以通过将其knit()到一个tempfile()文件并导入结果来实现,如下所示:
library(knitr)
library(readr)
ex_file <- tempfile(fileext = ".tex")
knitr::knit(text = "foo", output = ex_file)
knitted_obj <- readr::read_file(ex_file)
knitted_obj

返回值

# [1] "foo\n"

有没有一种方法可以在不使用tempfile()的情况下,直接将结果“管道化”到一个向量中?


你问我为什么要这样做?

  • *.tex字符串将被以编程方式保存到磁盘,并稍后呈现为PDF。从磁盘中读取呈现的*.tex会使代码更加复杂。
  • 缓存只是更容易,而且将此缓存移动到另一台机器上也很容易。
  • 总的来说,我真的很害怕副作用,特别是跨机器/操作系统的文件系统问题。我希望将它们隔离到尽可能少的(print()save()plot())函数中。

这会让我成为一个不好的(或者只是强迫症的)R开发者吗?


这与此问题有关,但并非重复。我想直接在R中捕获CLI工具(如下游的texi2pdf)的输出,而不触及文件系统。 Knitr是本地的R,所以这是一个不同的问题,我猜测。 - maxheld
2个回答

1
你可以使用con <- textConnection("varname", "w")创建一个连接,将其输出写入变量varname中,并在调用knit()时使用output=con。例如:
library(knitr)
con <- textConnection("knitted_obj", "w")
knit(text="foo", output = con)
close(con)
knitted_obj

这个方法的返回结果与您的临时文件方法相同,除了换行符。多行文本将显示为knitted_obj的不同元素。我没有计时,但是文本连接因速度较慢而闻名,所以这并不一定比写入文件系统更快。


1
这应该像这样一行简单明了:
knitted_obj = knitr::knit(text = "foo")

您可能需要再次阅读帮助页面?knitr::knit,以了解它返回的内容。


哎呀。非常感谢,很抱歉问了不必要的问题;我没有阅读返回值文档的第二句话。 - maxheld
我能理解你为什么没有注意到它。knitr的绝大多数用例是编织文件而不是文本。 - Yihui Xie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接