在knitr R代码中传递下划线

Jim*_*ier 5 r knitr

我需要调用一个数据库,该数据库在knitr的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)
@
Run Code Online (Sandbox Code Playgroud)

由于"table_10_20"中的下划线,我得到错误,我错过了$("Missing $ inserted").添加'\ $ \'和'\ $ \',我已经玩了很多,你可以命名.还使用了cat()和paste(),单引号和双引号.有什么建议?在此先感谢您的帮助.我正在运行Ubuntu 11.10,并使用pdfLaTeX从RStudio调用knitr,如果这很重要的话.

mat*_*fee 11

有可能你有一个带有下划线的列名.

回想一下,results='asis'只是将所有输出原样转储到tex文档中.

例如,这是您的问题的可重现示例:

% 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}   
Run Code Online (Sandbox Code Playgroud)

如果我执行此操作,knitr我会收到"Missing $inserted".

如果我查看生成的.tex文件,我会看到:

% 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}
Run Code Online (Sandbox Code Playgroud)

看到列名col_1col_2刚刚倾倒的,是到该文件?好吧,在LaTeX中,下划线有一个特殊含义(下标),它只在数学模式下有效,因此LaTeX编译器试图在数字$周围放置数学模式分隔符(),给出错误.

在您的情况下,根据您的输出需要,您有几个选项.

  1. 使用\begin{verbatim}results='asis'保护下划线.这会将您的输出转储到verbatim环境中.

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

    使用逐字

  2. 使用results='markup':这就像一个逐字环境,除了sweave颜色输出.默认情况下,它会##在每行前面添加注释标记(); 删除此用途comment=NA.(你不能太清楚这张照片与上面的不同之处;除了它有灰色背景以区别于文档的其余部分之外,它是相同的.它与你使用时的标记相同echo=T).

    <<results='markup', comment=NA, echo=F>>=      
    print(table_10_20)  
    @       
    
    Run Code Online (Sandbox Code Playgroud)

    使用results = markup

  3. 上面两个只是用字体固定打印你的表格.如果你想要一个合适的乳胶表,你可以使用像这样的包xtable,它可以转换data.frame(和类似的)ino正确的LaTeX(或HTML)标记.我认为还有其他一些包可以做到这一点,但目前他们逃脱了我.你results='asis'在这里使用 (有关详细信息,请参阅文档,您真的可以控制表中打印内容的各个方面以及如何):

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

    使用xtable