2015-05-24 43 views
7

Vorrei creare un ciclo, che mi consente di salvare automaticamente i rapporti PDF, che sono stati generati da un file .Rmd. Ad esempio, se una variabile "ID" ha 10 righe, vorrei che R mi salvi automaticamente 10 rapporti, in una directory specifica. Questi rapporti possono variare in base all'ID selezionato.R Knitr PDF: Esiste la possibilità di salvare automaticamente i report PDF (generati da .Rmd) attraverso un ciclo?

un post precedente (Using loops with knitr to produce multiple pdf reports... need a little help to get me over the hump) si è occupata della creazione di più report in formato PDF generati da .Rnw file. Ho cercato di applicare l'approccio come segue:

#Data 

```{r, include=FALSE} 
set.seed(500) 
Score <- rnorm(40, 100, 15) 
Criteria1<-rnorm(40, 10, 5) 
Criteria2<-rnorm(40, 20, 5) 
ID <- sample(1:1000,8,replace=T) 
df <- data.frame(ID,Score,Criteria1,Criteria2) 

#instead of manually choosing the ID: 

subgroup<- subset(df, ID==1) 

# I would like to subset the Data through a loop. My approach was like like this: 

for (id in unique(df$ID)){ 
subgroup<- df[df$ID == id,]} 

``` 

```{r, echo=FALSE} 
#Report Analysis 

summary(subgroup) 
``` 
#Here will be some text about the summary. 



# At the end the goal is to produce automatic pdf reports with the ID name as a filename: 

library("rmarkdown") 
render("Automated_Report.rmd",output_file = paste('report.', id, '.pdf', sep='')) 
+0

È necessario un ciclo, non due. Il modo in cui il tuo codice è impostato, ti collegherai attraverso tutti i tuoi sottogruppi e, quando avrai finito, creerai una serie di PDF. È necessario combinarli: selezionare un sottogruppo e creare un report basato su di esso all'interno dello stesso ciclo. Se hai bisogno di più aiuto, dovrai essere molto più specifico di "sembra non funzionare" e probabilmente creare un esempio riproducibile. – Gregor

+0

Si potrebbe anche guardare a 'knit_expand' o al pacchetto' brew'. – Gregor

+0

Ho provato anche con un solo ciclo per il subsetting. Ma non ha funzionato neanche. Ho fornito un semplice esempio riproducibile, che incolla solo il riepilogo per ogni ID in un report e anche scambiato la funzione knit2pdf() con la funzione render() dal pacchetto rmarkdown. @ Gregor – user3491036

risposta

8

Adattamento tuo esempio:

È necessario un solo file .rmd "modello". Potrebbe essere qualcosa di simile, salvarlo come template.rmd.

This is a subgroup report. 

```{r, echo=FALSE} 
#Report Analysis 
summary(subgroup) 
``` 

Quindi, è necessario uno script R che caricherà i dati desiderati, ciclo attraverso i sottoinsiemi di dati, e per ogni sottoinsieme

  1. definire l'oggetto subgroup utilizzato all'interno del template
  2. render il modello per l'output desiderato

Quindi, in questo script separato:

# load data 
set.seed(500) 
Score <- rnorm(40, 100, 15) 
Criteria1<-rnorm(40, 10, 5) 
Criteria2<-rnorm(40, 20, 5) 
ID <- sample(1:1000,8,replace=T) 
df <- data.frame(ID,Score,Criteria1,Criteria2) 

library("rmarkdown") 

# in a single for loop 
# 1. define subgroup 
# 2. render output 
for (id in unique(df$ID)){ 
    subgroup <- df[df$ID == id,] 
    render("template.rmd",output_file = paste0('report.', id, '.html'))  
} 

Questo prodotto 8 file html nella mia directory di lavoro, ciascuno con una sintesi di un diverso sottoinsieme dei dati.

Nota che questo non funziona se si prova a cliccare sul pulsante "maglia" dentro RStudio, come che esegue il codice R in una sessione separata R. Tuttavia, quando si esegue esplicitamente la console utilizzando render (o knit2pdf), il codice R nel file rmd ha ancora accesso all'ambiente globale.

Un'opzione diversa per raggiungere questo obiettivo sarebbe utilizzare il pacchetto brew.

+0

Grazie a @Gregor ha funzionato! Immagino tu abbia scelto .html perché .pdf ha creato un errore basato sull'output pandoc del sommario. Poiché questo era comunque un semplice esempio, alla fine non ha fatto la differenza. – user3491036

+0

Sì, ho pensato che sarebbe stato utile elaborare i principi generali e che i dettagli del contenuto sarebbero facilmente seguiti. – Gregor