knitr:在Rmarkdown文档中运行所有块

时间:2014-07-15 09:00:22

标签: r knitr rstudio r-markdown

我有一个.rmd文件,编织过程就好了。

我想在文档中运行所有块,以便我可以探索 导致我的R shell。

在Rstudio中,有一个选项可以运行文档中的所有块, 但是我找不到在简单的R会话中实现相同效果的方法(在我的终端中打开)。

有办法做到这一点吗?

3 个答案:

答案 0 :(得分:17)

使用Run all chunks相当于:

  • 创建临时R文件
  • 使用knitr::purl将所有R块提取到临时文件
  • 使用source()运行文件
  • 删除临时文件

像这样:

tempR <- tempfile(fileext = ".R")
library(knitr)
purl("SO-tag-package-dependencies.Rmd", output=tempR)
source(tempR)
unlink(tempR)

但是你想把它变成一个函数。这很容易,除非您必须使用sys.source在全局环境中运行R脚本:

runAllChunks <- function(rmd, envir=globalenv()){
  tempR <- tempfile(tmpdir = ".", fileext = ".R")
  on.exit(unlink(tempR))
  knitr::purl(rmd, output=tempR)
  sys.source(tempR, envir=envir)
}

runAllChunks("SO-tag-package-dependencies.Rmd")

答案 1 :(得分:3)

您甚至不必使用purl():如果您在R控制台中knit文档,则会在全局环境中评估代码(默认情况下,请参阅envir= knit())的选项。

因此,如果您的文件是my.Rmd,那么只需运行

即可
library(knitr)
knit('my.Rmd')

一个方便的技巧:如果您只想运行文档中的某个点,请插入如下错误:

stop('here')

在您希望它停止的代码块中,并设置以下knitr选项:

opts_chunk $集(误差= FALSE)

在运行knit()之前在控制台中

答案 2 :(得分:0)

将文件加载为原始文本变量

file_name="your_file_name.Rmd"
txt <- readLines(file_name)

标识开始和结束块(第一列将是每个块的块开始的行,第二列将是块的结束行)

chunks <- matrix(grep("```",txt),ncol =  2,byrow = T)

选择开始和结束块之间的所有行,将其作为字符串的实际代码

temp <- apply(chunks,1,function(x) txt[(x[1]+1):(x[2]-1)])

执行代码。(此行执行所有包含在字符串变量中的代码)

eval(parse(text = temp))