【问题标题】:How to knit directly to R object?如何直接编织到 R 对象?
【发布时间】:2017-07-26 08:10:22
【问题描述】:

我想将knit()ted 文档作为 R 对象直接存储在 R 中,作为 字符向量

我知道我可以通过 knit()ing 到 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 开发人员吗?

【问题讨论】:

  • 这与 this question 的副本有关,但我想直接在 R 中捕获 CLI 工具(例如下游 texi2pdf)的输出,而不触及文件系统。 Knitr 是原生 R,所以我猜这是一个不同的问题。

标签: r pipe latex knitr


【解决方案1】:

它应该像这样简单的一行:

knitted_obj = knitr::knit(text = "foo")

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

【讨论】:

  • 哎呀。非常感谢,并对不必要的问题感到抱歉; 没有读过返回值文档的第二句。
  • 我能理解你为什么没有注意到它。 knitr 的绝大多数用例是编织文件而不是文本。
【解决方案2】:

您可以使用con &lt;- textConnection("varname", "w") 创建一个将其输出写入变量varname 的连接,并在对knit() 的调用中使用output=con。例如:

library(knitr)
con <- textConnection("knitted_obj", "w")
knit(text="foo", output = con)
close(con)
knitted_obj

返回与您的 tempfile 方法相同,但换行符除外。多行将显示为knitted_obj 的不同元素。我还没有计时,但文本连接以速度慢而著称,因此这不一定像写入文件系统一样快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-10
    • 1970-01-01
    • 2017-10-17
    • 2012-08-06
    • 2022-06-10
    • 2014-03-19
    • 1970-01-01
    相关资源
    最近更新 更多