将字符串从 R 脚本传递到 .Rnw 模板 R 代码部分,brew/knitr

将字符串从 R 脚本传递到 .Rnw 模板 R 代码部分,brew/knitr

这是我的第一篇帖子,我对这些都很陌生,所以我希望我做得对。我的问题如下:我编写了一些 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。希望这能有所帮助。

相关内容