2012-08-28 14 views
5

Devo chiamare un database che abbia caratteri di sottolineatura nei nomi delle tabelle in un blocco R in knitr. Ci sono un paio di migliaia di nomi di tabelle, e cambiare i nomi sarebbe una seccatura enorme. Qualcosa di simile:Passare il carattere di sottolineatura in knitr Codice R

<<classRun,fig=FALSE,print=FALSE,echo=FALSE>>= 
getdat = function(nbr1,nbr2){ 
library(RODBC) 
database.dsn1<-c("db") 
database.user1<-c("username") 
database.password1<-c("password") 
channel<-odbcConnect(database.dsn1, database.user1, database.password1) 
dat = sqlQuery(channel,paste("select * from table_",nbr1,"_",nbr2, sep="")) 
} 
@ 

<< results='asis', echo = FALSE>>= 
dat = getdat(10,20) 
print(dat) 
@ 

ottengo l'errore che mi manca un $ ("Missing $ inserita la dicitura") a causa della sottolineatura in "table_10_20". Ho giocato molto con l'aggiunta di "\ $ \" e "\ $ \", lo nominate. Ho anche giocato con cat() e paste(), citazioni singole e virgolette. Eventuali suggerimenti? Grazie in anticipo per il vostro aiuto. Sto usando Ubuntu 11.10 e chiamando knitr da RStudio con pdfLaTeX, se questo è importante.

+0

Avrete anche di sospendere l'istruzione SQL con un punto e virgola –

risposta

11

È probabile che si disponga di un nome di colonna con un trattino di sottolineatura.

Ricordare che results='asis' esegue semplicemente il dump di tutte le uscite nel documento tex.

Per esempio, questo è un esempio riproducibile del problema:

% test.Rnw 
\documentclass[a4paper]{article}             
\begin{document}                 
<<classRun, fig=FALSE, print=FALSE, echo=FALSE>>=        
table_10_20 <- data.frame(col_1=1:10, col_2=runif(10))       
@                    

<<results='asis', echo=F>>=              
print(table_10_20)                
@                    
\end{document} 

Se corro questo attraverso knitr ottengo il "mancante $ inserito".

Se guardo il file .tex che viene prodotta, vedo:

% test.Rnw 
\documentclass[a4paper]{article}             
.... lots of tex .... 
\begin{document} 

    col_1 col_2 
1  1 0.69699 
2  2 0.12988 
3  3 0.19662 
4  4 0.04299 
5  5 0.08750 
6  6 0.72969 
7  7 0.19818 
8  8 0.27855 
9  9 0.81806 
10 10 0.56135 

\end{document} 

vedere come i nomi delle colonne col_1 e col_2 sono solo oggetto di dumping così com'è nel file? Bene, in LaTeX un carattere di sottolineatura ha un significato speciale (pedice), che è valido solo in modalità matematica, quindi il compilatore LaTeX prova a mettere i delimitatori della modalità matematica ($) attorno alla parola, dando il tuo errore.

Nel tuo caso, hai alcune opzioni a seconda di ciò che vuoi per il tuo output.

  1. Usa \begin{verbatim} con results='asis' per proteggere le sottolineature. Questo farà uscire l'output in un ambiente verbatim.

    \begin{verbatim} 
    <<results='asis', echo=F>>=  
    print(table_10_20)        
    @  
    \end{verbatim} 
    

    using verbatim

  2. Usa results='markup': questo è come un ambiente verbatim tranne i colori sweave l'uscita. Per impostazione predefinita verrà inserito un contrassegno di commento (##) davanti a ogni riga; per rimuovere questo uso comment=NA. (Non si può vedere troppo bene come questa immagine sia diversa da quella sopra, è la stessa eccetto che ha uno sfondo grigio per distinguerla dal resto del documento: è la stessa marcatura di quando si usa echo=T).

    <<results='markup', comment=NA, echo=F>>=  
    print(table_10_20) 
    @  
    

    using results=markup

  3. È possibile che due semplicemente stampare il tavolo così come sono in fissa con carattere. Se si desidera una tabella di lattice corretta, è possibile utilizzare un pacchetto come xtable, che può convertire un data.frame (& simile) in un markup LaTeX (o HTML) appropriato. Penso che ci siano altri pacchetti in grado di farlo anche se per il momento mi sfuggono. Tu usi results='asis' qui.(Vedere la documentazione per maggiori dettagli, è davvero possibile controllare ogni aspetto di ciò che viene stampato nella tabella e come):

    <<results='asis', echo=F>>=  
    library(xtable)  
    print(xtable(table_10_20), include.rownames=FALSE) 
    @     
    

    using xtable

+0

+1 per il suggerimento di xtable: è un modo molto migliore per presentare tabelle in knitr o Sweave. –

+0

Grazie per l'aiuto, ha funzionato come un fascino. –

Problemi correlati