2012-08-28 8 views
5

Ich muss eine Datenbank, die Unterstriche in den Tabellennamen in einem R-Chunk in Knitr hat. Es gibt ein paar tausend Tabellennamen, und das Ändern der Namen wäre ein großer Ärger. Etwas wie:Pass Unterstreich in Knitr R Code

<<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) 
@ 

bekomme ich den Fehler, dass ich ein $ fehle ("Missing $ eingefügt") wegen der Unterstrich in "table_10_20". Ich habe viel herum gespielt mit dem Hinzufügen von '\ $ \', und '\ $ \', Sie nennen es. Auch gespielt mit cat(), und paste(), und einfache Anführungszeichen und doppelte Anführungszeichen. Irgendwelche Vorschläge? Vielen Dank im Voraus für Ihre Hilfe. Ich benutze Ubuntu 11.10 und rufe knitr von RStudio mit pdfLaTeX auf, wenn das wichtig ist.

+0

Sie werden auch Ihre SQL-Anweisung beenden müssen mit ein Semikolon –

Antwort

11

Wahrscheinlich haben Sie einen Spaltennamen mit einem Unterstrich darin.

Erinnern Sie sich, dass results='asis' nur alle Ausgabe wie es ist in das Textdokument Dumps.

Zum Beispiel ist dies ein reproduzierbares Beispiel für Ihr Problem:

% 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} 

Wenn ich dies durch knitr laufen bekomme ich die „fehlenden $ eingefügt“.

Wenn ich an der .tex-Datei suchen, die produziert wird sehe ich:

% 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} 

Sehen Sie, wie die Spaltennamen col_1 und col_2 sind gerade abgeladen in die Datei, wie sie ist? Nun, in LaTeX hat ein Unterstrich eine spezielle Bedeutung (tiefgestellt), die nur im mathematischen Modus gültig ist, daher versucht der LaTeX-Compiler die mathematischen Modustrennzeichen ($) um das Wort herum zu setzen, was zu Ihrem Fehler führt.

In Ihrem Fall haben Sie ein paar Optionen, je nachdem, was Sie für Ihre Ausgabe wollen.

  1. Verwenden \begin{verbatim} mit results='asis' die Unterstrichen zu schützen. Dadurch wird Ihre Ausgabe in eine verbatim Umgebung ausgegeben.

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

    using verbatim

  2. Verwendung results='markup': Das ist wie eine wortgetreue Umgebung außer Sweave Farben der Ausgang. Standardmäßig wird vor jeder Zeile eine Kommentarmarke (##) eingefügt. Um diese Verwendung zu entfernen, verwenden Sie comment=NA. (Sie können nicht gut sehen, wie sich dieses Bild von dem obigen unterscheidet; es ist dasselbe, außer dass es einen grauen Hintergrund hat, um es vom Rest des Dokuments zu unterscheiden. Es ist das gleiche Markup wie bei Verwendung von echo=T).

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

    using results=markup

  3. Die beiden oben genannten einfach Ihre Tabelle drucken in Fest mit Schrift, wie sie ist. Wenn Sie eine richtige Latex-Tabelle möchten, können Sie ein Paket wie xtable verwenden, das eine data.frame (&ähnliche) ino-LaTeX (oder HTML) Markup konvertieren kann. Ich denke, es gibt andere Pakete, die das auch können, aber für den Moment entgehen sie mir. Sie verwenden results='asis' hier.(Siehe die Dokumentation für weitere Details, die Sie wirklich jeden Aspekt steuern kann, was in der Tabelle gedruckt wird und wie):

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

    using xtable

+0

+1 für Vorschlag von XTable: es ist eine viel bessere Möglichkeit, Tabellen in Knitr oder Sweave zu präsentieren. –

+0

Danke für die Hilfe, arbeitete wie ein Zauber. –

Verwandte Themen