0

这是我的第一篇文章,我对这一切都很陌生,所以我希望我做对了。我的问题如下:我编写了一些 R 代码来从数据库中获取一些 ID,然后将其用于 brew 模板。该模板使用 Knitr R 然后围绕 ID 构建一些查询以获取数据,然后用于实际报告。

脚本是这样的:

...
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。例如,我想传递一个时间跨度,例如 from="2010-01-01" ,to="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 年。

有没有办法告诉代码块在设置之前不要对 brew 输入做任何事情,或者可能将参数从外部传递到块,这样它们就不必在块中设置?

我希望你能帮助我,或者告诉我一个正确的方法。

4

1 回答 1

0

该问题可以通过使用 shQuote("string") -函数来解决。这将保留日期,在这种情况下,fromdate 和 todate 保持原样。例子:

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

您可能需要根据您正在使用的操作系统调整类型。

于 2014-06-08T10:15:08.517 回答