我需要调用在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_1
和col_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)
@
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/