2012-08-28 8 views
5

knitrのR塊のテーブル名にアンダースコアを持つデータベースを呼び出す必要があります。数千のテーブル名があり、名前を変更することは大変な労力となります。 のような何か: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を呼び出しています。

+0

あなたはまたしてSQL文を終了する必要がありますxtableの提案にはセミコロン –

答えて

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を介してこれを実行した場合、私は、「挿入欠落$」を取得します。

Iが生成されます.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. アンダースコアを保護するためにresults='asis'\begin{verbatim}を使用してください。これにより、出力がverbatim環境にダンプされます。

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

    using verbatim

  2. 使用results='markup':これははSweave色出力を除いてそのまま環境のようなものです。デフォルトでは、すべての行の前にコメント記号(##)が置かれます。この使用を取り除くにはcomment=NA。 (あなたはこの写真が上記とどのように違うのかよく分かりません;文書の残りの部分と区別するために背景が灰色であることを除いて同じです。echo=Tと同じマークアップです)。

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

    using results=markup

  3. 上記の二つのフォントで固定してそのまま単にあなたのテーブルを印刷します。適切なラテックステーブルが必要な場合は、xtableのようなパッケージを使用できます。このパッケージでは、適切なLaTeX(またはHTML)マークアップでdata.frame(&に似たもの)を変換できます。私もこれを行うことができる他のパッケージがあると思うが、彼らは私を逃れる瞬間です。 results='asis'をここで使用します。(詳細はマニュアルを参照してください、あなたは本当に表に印刷する内容のあらゆる側面を制御し、どのようにすることができます):

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

    using xtable

+0

+1があります:これはknitrやSweaveでテーブルを表示する方がはるかに良い方法です。 –

+0

助けてくれてありがとう、魅力的に働いた。 –

関連する問題