使用 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()呼唤。