【问题标题】:sink() won't print output to text file in rmarkdownsink() 不会将输出打印到 rmarkdown 中的文本文件
【发布时间】:2017-01-01 01:03:15
【问题描述】:

假设我有一个名为 test.Rmd 的简单 rmarkdown 文档

---
output: pdf_document
---

This code tries to save output to a file called 'example.txt'
```{r}
sink(file='example.txt')
sink.number()
library(MASS)
summary(cars)
sink()
sink.number()
```

如果我在 RStudio 中运行它(使用 knit PDF 按钮),那么我会得到很多输出,但我相信最重要的是以下内容(我可以根据要求包含其他输出)

processing file: test.Rmd

"C:/Program Files/RStudio/bin/pandoc/pandoc" +RTS -K512m -RTS test.utf8.md --to latex --from markdown+autolink_bare_uris+ascii_identifiers+tex_math_single_backslash --output test.pdf --template "C:\Users\wammonj\Documents\R\win-library\3.2\rmarkdown\rmd\latex\default.tex" --highlight-style tango --latex-engine pdflatex --variable graphics=yes --variable "geometry:margin=1in" 
output file: test.knit.md


Output created: test.pdf
Warning message:
In sink() : no sink to remove

文件 example.txt 已生成,但输出不在其中,而 Rmarkdown 生成了一个名为 test.pdf 的文件,其中包含 summary(cars) 的输出。

是这个问题吗? Rmarkdown 是否使用 sink() 来制作其文档?有没有办法让输出同时出现在 pdf 文件和文本文件中?


补充:从@r2evans 的评论看来,rmarkdown 确实使用了 sink()。我已经玩过 sink() 了,看起来你可以同时进行多个转移,但你只能写入最近激活的一个(参见下面的示例)。

所以从输出看来,Rmarkdown 会立即关闭我的接收器,因为当我查看 sink.number() 时,它总是一个。

我仍在努力寻找解决方法,所以任何帮助都会很好。

多重改道示例:

sink(file = 'example1.txt')
sink(file = 'example2.txt')
sink.number() # prints 2 to example2.txt
x = seq(1,10)
x # prints to example2.txt
sink()
sink.number() # prints 1 to example1.txt
y = sum(x)
y # prints to example1.txt
sink()
sink.number() # prints 0 to R console

【问题讨论】:

  • knitr(由rmarkdown使用)uses capture.output其中uses sinksink deals with "diversions",虽然我承认并不完全了解它的所有内容,但我相信它们是排他性的,这意味着输出到一个或另一个(除非你创建一个类似于 shell 命令 tee 的函数)。

标签: r rstudio r-markdown


【解决方案1】:

我遇到了类似的问题。将输出保存到本地文件的一种解决方案是改用 write.csv() 函数,该函数也适用于非 csv 文件。

下面的 R 代码尝试将输出保存到名为“example.txt”的文件中。

write.csv(data.frame(data_to_save), file='example.txt')

【讨论】:

  • 感谢您的建议。我想我最终只运行了两次代码:一次在 rmarkdown 中,一次在 R 中。但这是一个更好的解决方案。
【解决方案2】:

这个问题是由于(我相信)evaluate 包对sink() 的使用出现错误,以及rmarkdown::render 的逐行评估。

rmarkdown::render() 将每次将每一行提交给evaluate::evaluate,但如果创建了新的sink() 但未在该行内关闭,evaluate 将失败。一种解决方法是将这些步骤定义为一个函数,其中初始sink(...) 和最终sink() 在一行中提交。当然,您尝试捕获结果的所有代码也需要在同一个函数中。

或者,请等待rmarkdownevaluate 开发人员解决问题:

【讨论】:

    猜你喜欢
    • 2011-12-19
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-24
    • 2016-03-08
    相关资源
    最近更新 更多