2014-02-19 30 views
0

這是我的第一篇文章,我對這一切都很陌生,所以我希望我這樣做是正確的。 我的問題如下: 我寫了一些R代碼從數據庫中獲取一些ID,然後用它們來創建模板。 該模板使用Knitr R然後在ID的周圍構建一些查詢以獲取用於實際報告的數據。從R腳本傳遞字符串到.Rnw模板R代碼部分,brew/knitr

腳本是這樣的:

... 
create.report() <- function(ID){ 

reportname <- "MyReport.Rnw"  
brew('template.rnw',reportname) 

knit(reportname) 

.... 
} 

與knitr的template.rnw獲得通過BREW通過ID:

\section*{This is a Report for <%=ID%>} 

<<loaddata, echo =FALSE>>= 
query <- paste0("SELECT ... WHERE ID= ",<%=ID%>) # this gets us the Data for the report 

data <- dbGetQuery(con,query) # Data from db is in Data now. 

@ 
... 

而這只是工作對我很好。但現在我想將更多參數從腳本傳遞到模板,然後只是簡單的輸入就像一個ID。例如,我想傳遞一個時間跨度像= 「2010-01-01」,以= 「2012-01-01」

到莫比使用這個喜歡

... 
create.report() <- function(ID,fromdate,todate){ 

reportname <- "MyReport.Rnw"  
brew('template.rnw',reportname) 

knit(reportname) 

.... 
} 

.rnw模板

<<loaddata, echo =FALSE>>= 
from <- paste0("AND date(...) =>'",<%=fromdate%>,"'") 
to <- paste0("AND date(...) =< '", <%=todate%>,"'") 
query <- paste0("SELECT ... WHERE ID= ",<%=ID%>,from,to) # this gets us the Data 

data <- dbGetQuery(con,query) # Data from db is in Data now. 

@ 
...  

但是,問題是,他不會離開沒有fromdate和todate要像「2010-01-01」的字符串,並八方通使其2008年

有沒有辦法告訴代碼大塊不要對釀造做任何事情在設置它之前輸入,或者將外部參數傳遞給塊,以便它們不必在塊中設置?

我希望你能幫我解決這個問題,或者告訴我一個適當的解決方法。

回答

0

該問題可以通過使用shQuote(「string」)函數來解決。在這種情況下,這將會保留日期和日期。例如:

from <- paste0("AND date(...) =>'",<%=shQuote(fromdate)%>,"'") 

您可能需要調整取決於您正在使用的操作系統的類型。