Knitr: запустить все куски в документе Rmarkdown

У меня есть .Rmd-документ, в котором процесс knitr просто прекрасен.

Я хотел бы запустить все куски в документе, чтобы я мог исследовать приводит к моей оболочке R.

В Rstudio есть возможность запускать все куски в документе, но я не могу найти способ добиться такого же эффекта в простой сессии R (открыт в моем терминале).

Есть ли способ сделать это?

Ответы

Ответ 1

Использование 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 script в глобальной среде:

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")

Ответ 2

Вам даже не нужно использовать purl(): если вы knit документ в консоли R, код оценивается в глобальной среде (по умолчанию см. параметр envir= на knit()).

Итак, если ваш файл my.Rmd, просто запустите

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

Удобный трюк: если вы хотите только запустить до определенной точки в документе, вставьте ошибку, например:

stop('here')

в точке фрагмента кода, которую вы хотите остановить, и установите следующую опцию knitr:

opts_chunk $множество (ошибка = FALSE)

в консоли перед запуском knit().

Ответ 3

загрузить файлы в текстовой переменной

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))