【问题标题】:Using purl to source a .Rmd file from within a Rnw file使用 purl 从 Rnw 文件中获取 .Rmd 文件
【发布时间】:2019-11-04 13:55:53
【问题描述】:

我在 .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

实际输出:



有人有这方面的经验吗? 这是一个错误还是我错过了什么? 感谢您的帮助!

【问题讨论】:

    标签: r r-markdown knitr


    【解决方案1】:

    根据?purl

    knitr 将尝试根据输入文档的文件扩展名来决定模式列表,例如Rnw文件使用apat$rnw列表,tex使用apat$tex列表,brew使用apat$brew,HTML文件使用apat$html

    但显然,这并不是故事的全部。请注意purl essentially is just a wrapper to knit。我的猜想是,在编织 RNW 文档时,有一些全局选项集使 knit 只查找类似 RNW 的模式,即使您是 purl 从 RNW 文档中输入 RMD 文件。

    要解决此问题,请通过在 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}
    

    【讨论】:

    • 我认为这可能符合bug
    • 这很有魅力,谢谢!我会将其添加为问题并将其标记为潜在错误。
    【解决方案2】:

    @Cl. 的猜想是正确的。函数knitr::knit() 引入了很多副作用,包括设置解析模式。在这种情况下,我强烈建议您在单独的 R 会话中运行 purl()。一种方法是改变

    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() 调用.

    【讨论】:

      猜你喜欢
      • 2015-05-27
      • 2016-05-11
      • 2012-07-20
      • 2016-11-07
      • 1970-01-01
      • 1970-01-01
      • 2013-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多