6

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()、一重引用符、二重引用符も試してみました。助言がありますか?よろしくお願いします。私はUbuntu11.10を実行していて、それが重要な場合は、pdfLaTeXを使用してRStudioからknitrを呼び出しています。

4

1 に答える 1

12

アンダースコアが含まれる列名がある可能性があります。

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と、「Missinginserted $」が表示されます。

生成される.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}withを使用します。results='asis'これにより、出力が環境にダンプされverbatimます。

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

    逐語的に使用する

  2. 使用results='markup':これは、出力に色を付けることを除けば、逐語的な環境に似ています。デフォルトでは##、すべての行の前にコメントマーク()が付けられます。この使用を削除するにはcomment=NA。(この写真が上記とどのように異なるかはよくわかりません。ドキュメントの他の部分と区別するために背景が灰色である点を除いて同じです。使用する場合と同じマークアップですecho=T)。

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

    results=markupを使用する

  3. 上記の2つは、テーブルをそのままフォントで固定して印刷するだけです。適切なラテックステーブルが必要な場合は、のようなパッケージを使用できます。これは、 (および同様の)適切でないLaTeX(またはHTML)マークアップxtableを変換できます。data.frameこれを行うことができる他のパッケージもあると思いますが、今のところそれらは私を逃れます。ここで使用results='asis'します。(詳細については、ドキュメントを参照してください。テーブルに印刷される内容とその方法のあらゆる側面を実際に制御できます):

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

    xtableを使用する

于 2012-08-29T00:08:48.520 に答える