同时运行R Markdown(check.Rmd)和R knitr(test.Rnw)文件

时间:2015-11-29 13:25:03

标签: r markdown knitr r-markdown

我有以下问题;有两个大文档,一个写在R Markdown(check.Rmd),另一个写在R knitr(test.Rnw)。在第一个文档中,我们有如下代码:

\section{Organisations Test}

\textbf{Running Organisations Checks}

<<CreateOrganisations, echo=FALSE, progress=TRUE, warning=FALSE, eval=TRUE>>=
source("OrganisationsTest.R")
OrganisationsTest(current_schema,server,user,pass)

@

另一个如下:

  2. check the downwards shock
```{r chunk_Int_Sh_p2,  echo=FALSE}
unique(param.int.shock.tab[SHOCKTYPE=="SHOCK_DOWN"&PERIODEND<21|PERIODEND==90, list( Maturity=PERIODEND, Shock_value=100*SHOCKVALUE)])
``` 

现在问题是:如何将两者结合起来,以便我只有一个脚本可以运行并一个接一个地编译。仅仅是为了澄清,我的意思是在两个文档中没有任何更改,我如何只有一个脚本适用于第一个文档knit PDF来创建pdf而另一个CompilePDF

我想在Linux中可以编写一个shell脚本,但在窗口中使用RStudio的回合是什么? 我真的很感激每一个暗示我都有点无奈!

附录:原则上如下:如果你要编译一个knitr文件你会在RStudio中使用compilePDF底部,我们有2个文件,对于Markdown文件,可以使用RStudio中的KnitPDF底部,但我们想要将两者放在一起并在一个底部点击。怎么可能?

1 个答案:

答案 0 :(得分:3)

RStudio按钮“编译PDF”(用于RNW文档)和“编织PDF”(用于RMD文档)很方便,但在这种情况下,了解他们做什么很重要为了重现相同或类似的行为。

总结问题,它要求一种方法将两个文件(RMD和RNW文档)转换为PDF,最好使用上面提到的两个按钮之类的按钮。

不幸的是(据我所知),无法向RStudio GUI添加任何用户定义的按钮。但是编写一个编译两个文档的R脚本很简单。

在下面我假设有两个文件:

  • first.Rmd

    This is a RMD file.
    
    ```{r, echo=FALSE}
    plot(1)
    ```
    
  • second.Rnw

    \documentclass{article}
    \begin{document}
    
    This is a RNW file.
    
    <<>>=
    plot(1)
    @
    \end{document}
    

要将first.Rmd编译为PDF,我们需要以下内容(请参阅How to convert R Markdown to PDF?):

library(knitr)
library(rmarkdown)

knit(input = "first.Rmd")
render(input = "first.md", output_format = "pdf_document")

knit调用从first.md生成first.Rmd,在块中执行R代码。 render将生成的markdown文件转换为PDF。 [注意底部的附录!]

要将first.Rnw编译为PDF,我们只需使用knit2pdf

即可
knit2pdf("second.Rnw")

将两个片段复制到一个R脚本中并单击“源”尽可能接近“一键式解决方案”。

但请注意,这些代码段与“编译/编织PDF”按钮非常相似,但不相同。 “编译”按钮启动新R会话,而上述解决方案使用当前会话

  • 在执行代码段之前,请确保使用正确的工作目录。
  • 默认情况下knitknit2pdf都使用envir = parent.frame()。这意味着块中的R代码在调用 enironment中执行(参见What is the difference between parent.frame() and parent.env() in R)。这可能是一个有用的功能,例如将变量“传递”到块中,但了解它很重要。否则,文档可能在一个会话中编译得很好(调用环境中存在某些变量)但不能在另一个会话中编译(缺少这些变量)。因此,就再现性而言,该特征有点危险。作为解决方案,可以使用envir = new.env(parent = as.environment(2));有关该主题的详细信息,请参阅knitr inherits variables from a user's environment, even with envir = new.env()

我刚刚意识到要关注render

  

如果输入需要编织,则在knit之前调用pandoc

(来源:?render

因此,knit(input = "first.Rmd"); render(input = "first.md", output_format = "pdf_document")可以简化为render(input = "first.Rmd", output_format = "pdf_document")。上述envir的{​​{1}}问题也适用于knit