我需要调用一个数据库,该数据库在knitr的R chunk中的表名中有下划线。有几千个表名,更改名称将是一个巨大的麻烦。 类似的东西:
<<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。
答案 0 :(得分: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}
如果我通过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_1
和col_2
如何按原样转储到文件中?好吧,在LaTeX中,下划线具有特殊含义(下标),它仅在数学模式下有效,因此LaTeX编译器会尝试将数学模式分隔符($
)放在单词周围,从而产生错误。
在您的情况下,您可以根据输出的需要选择一些选项。
将\begin{verbatim}
与results='asis'
一起使用以保护下划线。这会将您的输出转储到verbatim
环境中。
\begin{verbatim}
<<results='asis', echo=F>>=
print(table_10_20)
@
\end{verbatim}
使用results='markup'
:这就像一个逐字环境,除了sweave为输出着色。默认情况下,它会在每行前面添加注释标记(##
);删除此用途comment=NA
。 (你不能太清楚这张图片与上面的图片有什么不同;它是相同的,除了它有一个灰色的背景,以区别于文档的其余部分。它与你使用echo=T
时的标记相同)。
<<results='markup', comment=NA, echo=F>>=
print(table_10_20)
@
上面两个只是用字体固定打印你的表格。如果你想要一个合适的乳胶表,你可以使用像xtable
这样的包,它可以转换data.frame
(和类似的)ino正确的LaTeX(或HTML)标记。我认为还有其他一些包可以做到这一点,但目前他们逃脱了我。您在此处使用results='asis'
。 (有关详细信息,请参阅文档,您真的可以控制表中打印内容的各个方面以及如何):
<<results='asis', echo=F>>=
library(xtable)
print(xtable(table_10_20), include.rownames=FALSE)
@