【发布时间】:2017-03-18 20:56:57
【问题描述】:
我正在尝试使用 sprintf 生成包含多个嵌入变量的 SQL 查询。
我将带有%s 参数的SQL(它很大)存储为一个单独的文件,然后从r 中读取它。为了提高可读性,我创建了一个助手:
fillSQLQuery <- function(query, params){
#' fill query with params
do.call(sprintf, as.list(c(query, params)))
}
我的参数是日期、因子和字符串。当我将它们直接传递给函数时,我的日期被一个整数替换,而我的因子 - 用它的索引 (?)。另一方面,当我使用as.character 转换整个向量时,它会尝试将所有元素作为日期处理为字符串,并为所有非字符串返回 NA 或错误结果。
do.call(sprintf,
as.list(c(query,
c(as.character(startDateSequence[1]), # POSix DATE
as.character(endDateSequence[1]), # POSix DATE
lotTypes[1], id_list[1] )))) # string, factor
到目前为止,我发现的唯一解决方法是事先手动将日期和类型转换为字符。但是,我想知道是否有任何“明确”的方法可以做到这一点,就像 pythons 一样简单而强大:
'query {p1}, {p2}'.format(p1=X, p2=Y)
【问题讨论】:
-
如果没有
params向量的至少一个小例子,这几乎是不可能的。请制作一个最小的可重现示例。 -
我的意思是,在那个函数中,你怎么把
params作为向量传入?在您对其运行as.character之前,该向量是什么样的 - 一旦您在不同类型的对象上使用c(),它可能会变得一团糟。 -
你两次都是对的——我添加了一个向量的例子来更清楚,是的——出于某种原因,我假设 R 的向量支持混合类型的数据作为列表——但它们是不是。用列表简单替换向量解决了一个问题:fillSQLQuery(query, list(startDateSequence[1], endDateSequence[1], lotTypes[1], id_list[1]))
-
也许我看多了一些东西,但是我应该在哪里寻找一个具体的例子来说明
query的值和这些“参数”的值?
标签: r