【问题标题】:R: sprintf list of variables of mixed typeR:sprintf 混合类型变量列表
【发布时间】: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


【解决方案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"

【讨论】:

    猜你喜欢
    • 2016-09-07
    • 1970-01-01
    • 2013-11-05
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多