2014-08-27 14 views
6

Uso spineplot in R, sto cercando di creare una serie di trame che mettono a confronto alcuni potenziali covariate contro le categorie di età in modo che possiamo fare un po 'di esplorazione preliminare dei dati. Ho scritto questo codice in R Markdown e sto usando RStudio per creare il file in un output HTML. Tuttavia, ho difficoltà a ottenere ogni trama prodotta dal mio ciclo per avere un'intestazione RMarkdown appropriata. Ho provato a inserire cat("## my header") nel ciclo che produce ogni trama, ma per qualche motivo si presenta solo per il primo grafico e non per il resto. Si stampe fuori per il resto di loro, ma non viene interpretato come Markdown.Creare più trame con intestazioni RMarkdown unici

Ecco un esempio del mio codice:

--- 
title: "Minimal Working Example" 
author: "TARehman" 
date: "Wednesday, August 27, 2014" 
output: 
    html_document: 
    toc: yes 
--- 

# Spineplots 
```{r mwe, echo=FALSE, results='asis', fig.height=5, fig.width=8, dpi=300} 
tempdata <- data.frame(age=c("0-1","0-1","1-3","1-3","3-7","10-15","3-7","7-10"), 
         covA=c("Class 0","Class 1","Class 3","Class 2","Class 4","Class 3","Class 1","Class 2"), 
         covB=c("Class 1","Class 3","Class 2","Class 4","Class 4","Class 1","Class 1","Class 0"), 
         covC=c("Class 3","Class 3","Class 2","Class 3","Class 1","Class 4","Class 4","Class 4")) 

temp_covars <- c("covA","covB","covC") 

temp_locvec <- c(0.1,0.3,0.5,0.7,0.9) 
temp_labvec <- c("0-1","1-3","3-7","7-10","10-15") 
temp_colvec <- rainbow(n = 5,start = 7/12,end = 9/12,alpha = 0.8) 

for(x in temp_covars) { 

    cat(paste("## Spineplot of",x,"vs. age groups\n",sep=" ")) 

    spineplot(x = tempdata[[x]], 
       y = tempdata$age, 
       ylab = "Age Group", 
       xlab = "Class", 
       col = temp_colvec, 
       off = 0, 
       yaxlabels = c(NA,NA,NA,NA,NA), 
       main = paste("Classes of",x,"versus age groups",sep=" ")) 

    for(j in 1:5) { 
     axis(side = 2, 
      at = temp_locvec[j], 
      labels = temp_labvec[j], 
      col.axis = temp_colvec[j], 
      font.axis = 2) 
     } 
    rm(j) 
} 
rm(list=c("x","temp_locvec","temp_labvec","temp_colvec")) 
``` 

L'output simile a questo.

Minimal Working Example Output

+0

se si imposta l'uscita a md_document, mostra il problema: '' ## diventa '\ # \ #' – baptiste

+0

Perché solo sui cicli successivi? E c'è un modo per prevenire una cosa del genere? – TARehman

+3

questo sembra un bug. Funziona se aggiungi linee vuote dopo ogni trama. – baptiste

risposta

5

Si scopre che avete bisogno di un ritorno a capo in più. Come ha sottolineato Yihui, un'intestazione ha bisogno di una riga vuota prima di essere interpretata correttamente da Markdown. L'aggiunta di un gatto semplice ("\ n \ n") alla fine del mio ciclo risolve le cose.

avevo provato solo l'aggiunta di un'interruzione di linea, ma ha sbagliato che due sono stati necessari per ottenere l'intestazione deve essere interpretato in modo corretto.

--- 
title: "Working Solution" 
author: "TARehman" 
date: "September 3, 2014" 
output: 
    html_document: 
    toc: yes 
--- 

# Spineplots 
```{r mwe, echo=FALSE, results='asis', fig.height=5, fig.width=8, dpi=300} 
tempdata <- data.frame(age=c("0-1","0-1","1-3","1-3","3-7","10-15","3-7","7-10"), 
         covA=c("Class 0","Class 1","Class 3","Class 2","Class 4","Class 3","Class 1","Class 2"), 
         covB=c("Class 1","Class 3","Class 2","Class 4","Class 4","Class 1","Class 1","Class 0"), 
         covC=c("Class 3","Class 3","Class 2","Class 3","Class 1","Class 4","Class 4","Class 4")) 

temp_covars <- c("covA","covB","covC") 

temp_locvec <- c(0.1,0.3,0.5,0.7,0.9) 
temp_labvec <- c("0-1","1-3","3-7","7-10","10-15") 
temp_colvec <- rainbow(n = 5,start = 7/12,end = 9/12,alpha = 0.8) 

for(x in temp_covars) { 

    cat(paste("## Spineplot of",x,"vs. age groups\n",sep=" ")) 

    spineplot(x = tempdata[[x]], 
       y = tempdata$age, 
       ylab = "Age Group", 
       xlab = "Class", 
       col = temp_colvec, 
       off = 0, 
       yaxlabels = c(NA,NA,NA,NA,NA), 
       main = paste("Classes of",x,"versus age groups",sep=" ")) 

    for(j in 1:5) { 
     axis(side = 2, 
      at = temp_locvec[j], 
      labels = temp_labvec[j], 
      col.axis = temp_colvec[j], 
      font.axis = 2) 
     } 
    rm(j) 
    cat("\n\n") 
} 
rm(list=c("x","temp_locvec","temp_labvec","temp_colvec")) 
``` 
+1

Sembra buono. Per favore, sentitevi liberi di accettarlo :) –

+0

Ho provato codice di esempio da diverse persone e non riesco a risolvere uno strano problema: il primo e il secondo titolo appaiono nel file html, quindi il primo grafico, quindi il terzo titolo , quindi la seconda trama, quindi "NA", quindi la terza trama. Qualche modo per risolvere questo problema? – Nova

+0

@Nova Suggerirei di fare una nuova domanda e quindi creare il tuo esempio. Otterrai risposte migliori facendo così. – TARehman

1

incollo un breve esempio che avevo preparato per another question:

```{r, results='asis'} 
cat("\n\n## Title") 
for (s in unique(cars$speed)){ 
    cat("\n\n### speed",s) 
} 
``` 

ho cancellato questo esempio in the other question come lo era sulla sintassi Markdown e non si adattava con Latex/argomento Rnw.

Problemi correlati