Obiettivo
Voglio creare la mia analisi dei dati riproducibile facendo in modo che i blocchi dipendano da tutti i blocchi precedenti. Quindi, se ci sono 3 blocchi e io cambio qualcosa nel 1 ° blocco, i successivi 2 blocchi dovrebbero essere ripetuti in modo che riflettano la modifica apportata alle uscite. Voglio aggiungere questa condizione nelle opzioni globali del blocco nella parte superiore del documento, in modo da non dover utilizzare più volte lo dependson
.Come rendere i pezzi di codice dipendono da tutti i blocchi precedenti in knitr/rmarkdown?
Problemi
Le uscite di un pezzo non cambiano se non viene modificato e cache=TRUE
. Per i pezzi che contengono il codice, che può renderli affidabili su tutti i precedenti utilizzando seguito nella parte superiore del documento:
```{r setup, echo=FALSE}
# set global chunk options:
library(knitr)
opts_chunk$set(cache=TRUE, autodep = TRUE)
dep_auto()
```
Se uno dei pezzi di cui sopra è cambiato, tutti pezzi successivi sono re-run. Ma questo non funziona se uso source()
in blocchi per leggere gli script R. Di seguito è riportato un documento di esempio:
---
title: "Untitled"
output: html_document
---
```{r setup, echo=FALSE}
# set global chunk options:
library(knitr)
opts_chunk$set(cache=TRUE, autodep = TRUE)
dep_auto()
```
# Create Data
```{r}
#source("data1.R")
x <- data.frame(col1 = 4:10, col2 = 6:12)
x
```
# Summaries
```{r}
#source("data2.R")
median1.of.x <- sapply(x, function(x) median(x)-1)
sd.of.x <- sapply(x, sd)
plus.of.x <- sapply(x, function(x) mean(x)+1)
jj <- rbind(plus.of.x, sd.of.x, median1.of.x)
```
```{r}
jj
```
Ora, se cambio uno qualsiasi dei 1 ° 2 pezzi il terzo pezzo dà uscita corretta dopo knit
ting. Ma se invece inserisco il primo codice del blocco in un file sorgente data1.R
e il secondo pezzo nel file data2.R
, mantenendo le opzioni globali del blocco come prima, se apporto delle modifiche nei file di origine non si riflettono correttamente nell'output del terzo blocco. Ad esempio, la modifica x
-x <- data.frame(col1 = 5:11, col2 = 6:12)
dovrebbe cedere:
> jj
col1 col2
plus.of.x 9.000000 10.000000
sd.of.x 2.160247 2.160247
median1.of.x 8.000000 9.000000
Ma con l'uso di source()
come discusso in precedenza, i rapporti knitr
documento:
jj
## col1 col2
## mean.of.x 5.000000 9.000000
## sd.of.x 2.160247 2.160247
## minus.of.x 6.000000 10.000000
Quali impostazioni devo cambiare per usare source
in knitr
documenti correttamente?
quando si utilizza il metodo 'fonte fissa, si sta commentando la x <' - data.frame) 'linea (, giusto? – rawr
Knitr non è molto adatto per il tipo di flusso di lavoro dichiarativo di cui hai bisogno per farlo accadere. Consiglierei make & makefiles, o se vuoi rimanere completamente all'interno di R, l'eccellente [pacchetto remake] (https://github.com/richfitz/remake) – Ben
@rawr Sì, tengo solo il comando 'source' e commenta tutti gli altri. –