2012-08-28 18 views
5

में अंडरस्कोर पास करें मुझे डेटाबेस को कॉल करने की आवश्यकता है जिसमें knitr में आर खंड में तालिका नामों में अंडरस्कोर है। कुछ हज़ार टेबल नाम हैं, और नाम बदलना एक बड़ी परेशानी होगी। कुछ की तरह:knitr आर कोड

<<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" में अंडरस्कोर की वजह से ("गुम $ डाला") याद आ रही है मिलता है। मैंने '\ $ \', और '\ $ \' में जोड़ने के साथ बहुत कुछ खेला है, आप इसे नाम दें। बिल्ली(), और पेस्ट(), और एकल उद्धरण, और डबल उद्धरण के साथ भी खेला। कोई सुझाव? आपकी सहायता के लिये पहले से ही धन्यवाद। मैं उबंटू 11.10 चला रहा हूं, और पीडीएफएलएटीएक्स के साथ आरस्टूडियो से बुनाई बुला रहा हूं, अगर यह मायने रखता है।

+0

तुम भी साथ अपने एसक्यूएल बयान को समाप्त करना होगा xtable के सुझाव के लिए अर्ध-कॉलन –

उत्तर

11

संभावना है कि आपके पास अंडरस्कोर वाला कॉलम नाम है।

याद रखें कि results='asis' बस सभी आउटपुट को टैक्स दस्तावेज़ में डंप करता है।

% 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 सिर्फ फ़ाइल में के रूप में है फेंक दिया जाता है? खैर, लाटेक्स में अंडरस्कोर का एक विशेष अर्थ (सबस्क्रिप्ट) है, जो गणित मोड में केवल वैध है, इसलिए लाटेक्स कंपाइलर शब्द के चारों ओर गणित मोड डिलीमीटर ($) डालने का प्रयास करता है, जिससे आपकी त्रुटि मिलती है।

आपके मामले में, आपके पास अपने आउटपुट के लिए इच्छित कुछ के आधार पर कुछ विकल्प हैं।

  1. उपयोग \begin{verbatim}results='asis' साथ अंडरस्कोर की रक्षा के लिए। यह आपके आउटपुट को 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 जैसे पैकेज का उपयोग कर सकते हैं, जो data.frame (समान) को उचित लाटेक्स (या HTML) मार्कअप में परिवर्तित कर सकता है। मुझे लगता है कि ऐसे अन्य पैकेज भी हैं जो यह भी कर सकते हैं लेकिन इस पल के लिए वे मुझसे बचते हैं। आप यहां results='asis' का उपयोग करते हैं।(अधिक जानकारी के लिए दस्तावेज़ देखें, क्या तुम सच में क्या तालिका में मुद्रित हो जाता है के हर पहलू और कैसे नियंत्रित कर सकते हैं):

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

    using xtable

+0

+1: यह बुनाई या स्वीवे में टेबल प्रस्तुत करने का एक बेहतर तरीका है। –

+0

मदद के लिए धन्यवाद, एक आकर्षण की तरह काम किया। –