2012-08-28 7 views
5

Necesito llamar a una base de datos que tiene caracteres de subrayado en los nombres de tabla en un fragmento R en knitr. Hay un par de miles de nombres de tablas, y cambiar los nombres sería una gran molestia. Algo así como:Pase subrayado en knitr código 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) 
@ 

consigo el error que me falta un $ ("Missing $ inserta") debido a la subrayado en "table_10_20". He jugado mucho con la adición de '\ $ \', y '\ $ \', lo que sea. También se juega con cat(), y paste(), comillas simples y comillas dobles. ¿Alguna sugerencia? Gracias de antemano por tu ayuda. Estoy ejecutando Ubuntu 11.10 y llamando a knitr desde RStudio con pdfLaTeX, si eso es importante.

+0

También tendrá que terminar su instrucción SQL con un punto y coma –

Respuesta

11

Es probable que tenga un nombre de columna con un guion bajo.

Recuerde que results='asis' simplemente vuelca toda la salida tal como está en el documento de tex.

Por ejemplo, este es un ejemplo reproducible de su 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} 

Si funciono esto a través de knitr recibo el "Missing $ inserta".

Si miro el archivo .tex que consigue produce, veo:

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

ver cómo los nombres de columna y col_1col_2 son sólo objeto de dumping como está en el archivo? Bueno, en LaTeX un guión bajo tiene un significado especial (subíndice), que solo es válido en el modo matemático, por lo tanto, el compilador LaTeX intenta poner los delimitadores del modo matemático ($) alrededor de la palabra, dando su error.

En su caso, tiene algunas opciones dependiendo de lo que desee para su salida.

  1. Uso \begin{verbatim} con results='asis' para proteger los guiones bajos. Esto descargará su salida en un entorno verbatim.

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

    using verbatim

  2. Uso results='markup': esto es como un entorno verbatim excepto colores Sweave la salida. Por defecto, pondrá una marca de comentario (##) delante de cada línea; para eliminar este uso comment=NA. (No se ve muy bien cómo esta imagen es diferente de la anterior, es la misma excepto que tiene un fondo gris para distinguirla del resto del documento. Es la misma marca que cuando usas echo=T).

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

    using results=markup

  3. los dos anteriores, simplemente imprimir su mesa tal y como está en ejecución fija con la fuente. Si desea una tabla de látex adecuada, puede utilizar un paquete como xtable, que puede convertir un data.frame (& similar) en la marca propia LaTeX (o HTML). Creo que hay otros paquetes que pueden hacer esto también, pero por el momento se me escapan. Utiliza results='asis' aquí.(Consulte la documentación para más detalles, realmente se puede controlar todos los aspectos de lo que se imprime en la tabla y cómo):

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

    using xtable

+0

+1 por sugerencia de xtable: es una forma mucho mejor de presentar tablas en knitr o Sweave. –

+0

Gracias por la ayuda, funcionó como un encanto. –

Cuestiones relacionadas