Повторно используйте код с knitr в файлах rnw / sweave
Я ищу способ повторно использовать r-код в латексе, используя knitr. У меня есть несколько документов Excel, которые я хочу импортировать, анализировать и чертить одинаково на протяжении всей диссертации. Сейчас я делаю новый файл.rnw для каждого имеющегося у меня документа Excel. Это означает, что если я хочу что-то изменить, я должен делать это в каждом файле.rnw - что кажется неправильным подходом. Есть ли способ, где я могу вызвать один файл.rnw из родительского.rnw и предоставить ему имя файла Excel для импорта и работы.
2 ответа
Да, есть. Вы можете использовать как params
а также render
Функция, чтобы помочь с этим. Если вы не знакомы с параметрами, посмотрите здесь params и здесь для рендера. Я написал iris и mtcars, чтобы преуспеть в приведенных ниже примерах. В уценке ниже я вызываю параметр excel в чанке, который является файлом excel, и просто печатаю первые 10 строк.
---
title: "iris"
output: pdf_document
params:
excel: "G:/iris2.xlsx"
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```
```{r cars}
head(xlsx::read.xlsx(params$excel,sheetIndex = 1))
```
Теперь для изменения файла Excel вы можете использовать lapply
и функция рендеринга в файле.R.
#create list of excel files
exldocs <- c("G:/mtcars2.xlsx", "G:/iris2.xlsx")
#call the renders.rmd (above), pass the list of excel files to overwrite the #default param field, output a new pdf (call it whatever you want)
lapply(exldocs, function(x){
rmarkdown::render("G:/renders.Rmd", params = list(excel = x),
output_file =paste0(substr(x,1,nchar(x)-4),"pdf")
)})
Ты можешь использовать knitr::knit
и использовать envir
Аргумент в следующем. Здесь .Rnw
файл
% parameterized_reports.Rnw
\documentclass{article}
\begin{document}
<<>>=
foo
@
\end{document}
Вот код R
tmp <- environment()
tmp$foo <- "xyz"
knitr::knit("parameterized_reports.Rnw", envir = tmp, output = "output.tex")
tools::texi2pdf("output.tex")
system('open output.pdf')
Результат