Повторно используйте код с 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')

Результат

Другие вопросы по тегам