我正在尝试使用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
到目前为止我找到的解决方法的唯一方法是事先手动将日期和类型转换为字符。但是,我想知道是否有任何“明确”的方法可以做到这一点,就像蟒蛇一样简单而健壮:
'query {p1}, {p2}'.format(p1=X, p2=Y)
答案 0 :(得分:2)
好的,你还没有提供一个可重复的例子,但你的意图很明确,所以这里是你应该提供的代码,使这个例子成为一个很好的例子(自包含和可重复):
x1 = Sys.Date() # Date
x2 = Sys.time() # POSIX datetime
x3 = "hello" # character
x4 = factor("world", levels = c("world", "something")) # factor
qry = "Select %s, %s, %s, %s from blah"
现在已经建立了设置,我们可以开发解决方案。 list
是保存不同类别项目的自然结构:
params = list(x1, x2, x3, x4)
我们可以修改您的函数,在使用character
之前将每个列表元素转换为sprintf
:
fillSQLQuery = function(query, params){
params = lapply(params, as.character)
do.call(sprintf, c(query, params))
}
fillSQLQuery(qry, params)
# [1] "Select 2016-11-05, 2016-11-05 17:19:29, hello, world from blah"