【问题标题】:Pass underscore in knitr R code在knitr R代码中传递下划线
【发布时间】:2012-08-28 22:44:39
【问题描述】:

我需要调用一个在 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”中的下划线,我收到了我缺少 $(“Missing $ inserted”)的错误。我已经玩了很多添加 '\$\' 和 '\$\' 的方法。还使用了 cat()、paste()、单引号和双引号。有什么建议么?在此先感谢您的帮助。我正在运行 Ubuntu 11.10,并使用 pdfLaTeX 从 RStudio 调用 knitr,如果这很重要的话。

【问题讨论】:

  • 您还必须用分号终止您的 SQL 语句

标签: r knitr


【解决方案1】:

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

回想一下,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 编译器会尝试将数学模式分隔符 ($) 放在单词周围,从而导致错误。

在您的情况下,您有几个选项,具体取决于您想要输出的内容。

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

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

  2. 使用results='markup':这就像一个逐字环境,除了对输出进行sweave 着色。默认情况下,它会在每一行前面放置一个注释标记(##);删除这个使用comment=NA。 (你看不出这张图片与上面有什么不同;除了它有一个灰色背景以将它与文档的其余部分区分开来之外,它是相同的。它与使用 echo=T 时的标记相同)。

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

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

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

【讨论】:

  • +1 建议使用 xtable:这是在 knitr 或 Sweave 中呈现表格的更好方式。
猜你喜欢
  • 1970-01-01
  • 2018-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-22
  • 2019-08-22
  • 2022-10-22
相关资源
最近更新 更多