sink() 不会将输出打印到 rmarkdown 中的文本文件
sink() won't print output to text file in rmarkdown
假设我有一个名为 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 中这样做(使用编织 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.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
我运行遇到了类似的问题。将输出保存到本地文件的一种解决方案是改用 write.csv()
函数,它也适用于非 csv 文件。
下面的 R 代码尝试将输出保存到名为 'example.txt'.
的文件中
write.csv(data.frame(data_to_save), file='example.txt')
此问题是由于(我相信)evaluate
包对 sink()
的使用错误以及 rmarkdown::render
的逐行评估造成的。
rmarkdown::render()
一次将每行提交给 evaluate::evaluate
,但是如果创建了新的 sink()
但未在该行内关闭,evaluate
将失败。解决方法是将这些步骤定义为一个函数,其中初始 sink(...)
和最终 sink()
在一行中提交。当然,您尝试捕获其结果的所有代码也需要位于同一函数中。
或者,等待 rmarkdown
或 evaluate
开发人员是否解决了这个问题:
假设我有一个名为 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 中这样做(使用编织 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.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
我运行遇到了类似的问题。将输出保存到本地文件的一种解决方案是改用 write.csv()
函数,它也适用于非 csv 文件。
下面的 R 代码尝试将输出保存到名为 'example.txt'.
的文件中write.csv(data.frame(data_to_save), file='example.txt')
此问题是由于(我相信)evaluate
包对 sink()
的使用错误以及 rmarkdown::render
的逐行评估造成的。
rmarkdown::render()
一次将每行提交给 evaluate::evaluate
,但是如果创建了新的 sink()
但未在该行内关闭,evaluate
将失败。解决方法是将这些步骤定义为一个函数,其中初始 sink(...)
和最终 sink()
在一行中提交。当然,您尝试捕获其结果的所有代码也需要位于同一函数中。
或者,等待 rmarkdown
或 evaluate
开发人员是否解决了这个问题: