Sto cercando di utilizzare knitr per generare un report che esegua lo stesso set di analisi su diversi sottoinsiemi di un set di dati. Il progetto contiene due file Rmd: il primo file è un documento master che imposta lo spazio di lavoro e il documento, il secondo file contiene solo blocchi che eseguono le analisi e generano figure associate.R knitr: è possibile modificare a livello di programmazione le etichette dei blocchi?
Quello che mi piacerebbe fare è lavorare a maglia il file master, che chiamerebbe quindi il secondo file per ogni sottoinsieme di dati e includerebbe i risultati in un singolo documento. Di seguito è un semplice esempio.
documentoMaster:
# My report
```{r}
library(iterators)
data(mtcars)
```
```{r create-iterator}
cyl.i <- iter(unique(mtcars$cyl))
```
## Generate report for each level of cylinder variable
```{r cyl4-report, child='analysis-template.Rmd'}
```
```{r cyl6-report, child='analysis-template.Rmd'}
```
```{r cyl8-report, child='analysis-template.Rmd'}
```
analisi-template.Rmd:
```{r, results='asis'}
cur.cyl <- nextElem(cyl.i)
cat("###", cur.cyl)
```
```{r mpg-histogram}
hist(mtcars$mpg[mtcars$cyl == cur.cyl], main = paste(cur.cyl, "cylinders"))
```
```{r weight-histogam}
hist(mtcars$wt[mtcars$cyl == cur.cyl], main = paste(cur.cyl, "cylinders"))
```
Il problema è knitr non permette di etichette chunk non univoci, in modo da lavorare a maglia non riesce quando analysis-template.Rmd
viene chiamato il secondo tempo. Questo problema potrebbe essere evitato lasciando i chunks senza nome poiché le etichette univoche verrebbero automaticamente generate. Questo non è l'ideale, tuttavia, perché mi piacerebbe utilizzare le etichette del blocco per creare nomi di file informativi per i grafici esportati.
Una possibile soluzione sarebbe utilizzando una semplice funzione che accoda il cilindro corrente all'etichetta chunk:
```r{paste('cur-label', cyl, sep = "-")}
```
Ma non sembra che knitr calcolerà un'espressione nella posizione dell'etichetta pezzo .
Ho anche provato ad utilizzare una consuetudine chunk hook che ha modificato l'etichetta del pezzo corrente:
knit_hooks$set(cyl.suffix = function(before, options, envir) {
if (before) options$label <- "new-label"
})
Ma cambiare l'etichetta pezzo non ha influenzato i nomi dei file per i grafici generati, quindi non ho la pensano knitr stava usando la nuova etichetta.
Qualche idea su come modificare le etichette dei blocchi in modo che lo stesso documento figlio possa essere chiamato più volte? O forse una strategia alternativa per realizzare questo?
Ho usato questo approccio ma ho notato che l'uso di 'echo = FALSE' nel modello ha come risultato che il codice non è stato elaborato. Hai notato lo stesso comportamento? –
** Modifica **: ho utilizzato questo approccio insieme al pacchetto ** bookdown ** e ho notato che l'utilizzo di 'results = 'asis'' e' echo = FALSE' nel modello determina che il codice non è stato elaborato. La soluzione è di avere ogni output in un chunk di codice separato. –