这是我的第一篇帖子,我对这些都很陌生,所以我希望我做得对。我的问题如下:我编写了一些 R 代码来从数据库中获取一些 ID,然后将它们用于制作模板。该模板使用 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" 到="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.
@
...
但问题在于,他不会将起始日期和结束日期保留为像“2010-01-01”这样的字符串,而总是将其设为 2008。
有什么方法可以告诉代码块在设置 brew 输入之前不要对其进行任何操作,或者将参数从外部传递到块中,这样就不必在块中设置它们?
我希望你能帮助我解决这个问题,或者告诉我一个正确的方法。
答案1
可以使用 shQuote("string") 函数解决该问题。这将保留日期(在本例中为 fromdate 和 todate)不变。示例:
from <- paste0("AND date(...) =>'",<%=shQuote(fromdate)%,"'")
您可能需要根据您正在使用的操作系统调整类型。
答案2
距离我上次发布这个帖子已经过去了很长时间,但我记得它是将 fromdate 作为字符串获取。如果没有 shQuote,在与其余字符串 paste0("AND date(...) =>, ...) 连接之前,它总是被解释为 2010-01-01 = 2010 - 2 = 2008。希望这能有所帮助。