r - 在Knitr R代码中传递下划线

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

由于出现“table_10_20”中的下划线,因此我得到了一个缺少$(“缺少$插入”)的错误。我经常在添加'\$\'和'\$\'的过程中扮演很多角色。还可以使用cat()和paste()以及单引号和双引号。有什么建议么?在此先感谢您的帮助。我正在运行Ubuntu 11.10,并在RStudio中使用pdfLaTeX调用knitr(如果有的话)。

最佳答案

您可能有一个带下划线的列名。

回想一下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}   

如果我通过knitr运行此程序,则会得到“插入的缺少$”。

如果查看生成的.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}

看看如何将列名col_1col_2照原样转储到文件中?好吧,在LaTeX中,下划线具有特殊含义(下标),仅在数学模式下有效,因此LaTeX编译器会尝试在单词周围放置数学模式定界符($),从而出现错误。

在您的情况下,根据您要输出的内容,您有一些选择。
  • \begin{verbatim}results='asis'一起使用可保护下划线。这会将您的输出转储到verbatim环境中。
    \begin{verbatim}
    <<results='asis', echo=F>>=       
    print(table_10_20)                              
    @      
    \end{verbatim}
    

  • 使用results='markup':这类似于逐字记录环境,只是对输出进行了上色处理。默认情况下,它将在每行前面添加一个注释标记(##);删除此使用comment=NA。 (您无法很好地看到此图片与上面的图片有何不同;它是相同的,只是它的背景是灰色的,以便与文档的其余部分区分开。它与使用echo=T时的标记相同)。
    <<results='markup', comment=NA, echo=F>>=      
    print(table_10_20)  
    @       
    

  • 上面两个简单地按原样打印了表格,并固定了字体。如果您想要合适的 latex 表,则可以使用 xtable 之类的包,该包可以将data.frame(和类似名称)转换为合适的LaTeX(或HTML)标记。我认为还有其他软件包也可以做到这一点,但就目前而言,它们已经使我逃脱了。您在这里使用results='asis'。 (有关更多详细信息,请参见文档,您实际上可以控制表格中打印内容的各个方面以及操作方式):
    <<results='asis', echo=F>>=      
    library(xtable)      
    print(xtable(table_10_20), include.rownames=FALSE)
    @                 
    

  • 关于r - 在Knitr R代码中传递下划线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12168584/

    相关文章:

    r - 无法在通过 Shiny 生成的 rmarkdown 文档中的 knitr::kable() 中使用 `format = "latex"`

    r - 通过标题和图表循环knitr

    r - 如何减小 knitr 生成的 pdf 文件的大小?

    r - R 中两个范围的重叠量 [DescTools?]

    r - 如何在 pdf/演示文稿中嵌入交互式 Shiny 图? (也许通过 knitR)

    r - 在 OSX 上通过 R 解决方法发送 Outlook 电子邮件

    r - 模型中波浪号运算符的含义?

    r - kable 函数 : "id" in the columns

    r - 为什么我们不能遍历 `...`?

    r - ggplot2 中的重叠密度图