R:sprintf 混合类型变量列表
Posted
技术标签:
【中文标题】R:sprintf 混合类型变量列表【英文标题】:R: sprintf list of variables of mixed type 【发布时间】: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
的值和这些“参数”的值?
【参考方案1】:
好的,您还没有提供可重现的示例,但您的意图很明确,所以这是您应该提供的代码以使其成为一个很好的示例(独立且可重现):
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)
我们可以修改你的函数,在使用sprintf
之前将每个列表元素转换为character
:
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"
【讨论】:
以上是关于R:sprintf 混合类型变量列表的主要内容,如果未能解决你的问题,请参考以下文章