使用 purl 从 Rnw 文件中获取 .Rmd 文件
Using purl to source a .Rmd file from within a Rnw file
我在.Rmd 文件中做了一些分析。我现在想在我正在编写为 .Rnw 文件的报告中使用在此文件中创建的一些对象。由于从 Sweave 切换到 knittr 作为编织引擎,发生了以下情况:
如果我 运行 控制台中的 purl(input = 'myfile.Rmd', output = 'myfile.R')
行,我得到一个 .R 文件,它只包含 .Rmd 文件中的 R 块。这就是我想要的。
但是,如果我将此行放入 .Rnw 文件并编织它(即 .Rnw 文件),我最终会得到一个 myfile.R
并且没有错误,但它完全是空的(除了一个换行符某些原因)。
我还尝试将 knitr::opts_chunk$set(purl = TRUE)
和 knit_hooks$set(purl = hook_purl)
放入 .Rmd 文件中,然后在我的 .Rnw 文件中使用 knit()
而不是 purl()
,但是结果是一样的。
下面是一个小例子:
test.Rnw
\documentclass{article}
\begin{document}
<<test>>=
library(knitr)
purl(input = 'test.Rmd', output = 'test.R')
@
\end{document}
test.Rmd
```{r}
answer <- 42
```
预期输出:
## ------------------------------------------------------------------------
answer <- 42
实际输出:
有人有这方面的经验吗?
这是一个错误还是我遗漏了什么?
感谢您的帮助!
根据?purl
:
knitr will try to decide the pattern list based on the filename extension of the input document, e.g. Rnw
files use the list apat$rnw
, tex
uses the list apat$tex
, brew
uses apat$brew
and HTML files use apat$html
但显然,这还不是全部。请注意 purl
essentially is just a wrapper to knit
。我的猜想是,在编写 RNW 文档时,有一些全局选项集使 knit
只查找类似 RNW 的模式,即使您 purl
从RNW 文档。
要解决此问题,请在 purl()
之前调用 pat_md()
来明确设置 Markdown 模式。之后,恢复之前的模式,以免干扰RNW文档的其余部分。
\documentclass{article}
\begin{document}
<<test>>=
library(knitr)
opat <- knit_patterns$get()
pat_md()
purl(input = 'test.Rmd', output = 'test.R')
knit_patterns$set(opat)
@
\end{document}
@Cl.的猜想是正确的。函数 knitr::knit()
引入了很多副作用,包括设置解析模式。在这种情况下,我强烈建议您 运行 purl()
在单独的 R 会话中。一种方法是更改
purl(input = 'test.Rmd', output = 'test.R')
至
xfun::Rscript_call(purl, list(input = 'test.Rmd', output = 'test.R'))
这确保 purl()
在(几乎)独立于当前 R 会话的新 R 会话中被调用,因此当前 R 会话中设置的解析模式不会影响新 R 会话的knitr::knit()
呼唤。
我在.Rmd 文件中做了一些分析。我现在想在我正在编写为 .Rnw 文件的报告中使用在此文件中创建的一些对象。由于从 Sweave 切换到 knittr 作为编织引擎,发生了以下情况:
如果我 运行 控制台中的 purl(input = 'myfile.Rmd', output = 'myfile.R')
行,我得到一个 .R 文件,它只包含 .Rmd 文件中的 R 块。这就是我想要的。
但是,如果我将此行放入 .Rnw 文件并编织它(即 .Rnw 文件),我最终会得到一个 myfile.R
并且没有错误,但它完全是空的(除了一个换行符某些原因)。
我还尝试将 knitr::opts_chunk$set(purl = TRUE)
和 knit_hooks$set(purl = hook_purl)
放入 .Rmd 文件中,然后在我的 .Rnw 文件中使用 knit()
而不是 purl()
,但是结果是一样的。
下面是一个小例子:
test.Rnw
\documentclass{article}
\begin{document}
<<test>>=
library(knitr)
purl(input = 'test.Rmd', output = 'test.R')
@
\end{document}
test.Rmd
```{r}
answer <- 42
```
预期输出:
## ------------------------------------------------------------------------
answer <- 42
实际输出:
有人有这方面的经验吗? 这是一个错误还是我遗漏了什么? 感谢您的帮助!
根据?purl
:
knitr will try to decide the pattern list based on the filename extension of the input document, e.g.
Rnw
files use the listapat$rnw
,tex
uses the listapat$tex
,brew
usesapat$brew
and HTML files useapat$html
但显然,这还不是全部。请注意 purl
essentially is just a wrapper to knit
。我的猜想是,在编写 RNW 文档时,有一些全局选项集使 knit
只查找类似 RNW 的模式,即使您 purl
从RNW 文档。
要解决此问题,请在 purl()
之前调用 pat_md()
来明确设置 Markdown 模式。之后,恢复之前的模式,以免干扰RNW文档的其余部分。
\documentclass{article}
\begin{document}
<<test>>=
library(knitr)
opat <- knit_patterns$get()
pat_md()
purl(input = 'test.Rmd', output = 'test.R')
knit_patterns$set(opat)
@
\end{document}
@Cl.的猜想是正确的。函数 knitr::knit()
引入了很多副作用,包括设置解析模式。在这种情况下,我强烈建议您 运行 purl()
在单独的 R 会话中。一种方法是更改
purl(input = 'test.Rmd', output = 'test.R')
至
xfun::Rscript_call(purl, list(input = 'test.Rmd', output = 'test.R'))
这确保 purl()
在(几乎)独立于当前 R 会话的新 R 会话中被调用,因此当前 R 会话中设置的解析模式不会影响新 R 会话的knitr::knit()
呼唤。