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