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 混合类型变量列表的主要内容,如果未能解决你的问题,请参考以下文章

sprintf函数的用法是啥?

如何使用sprintf格式化R中数据框的打印?

在R中使用带有向量而不是可变数量的参数的sprintf

sprintf

sprintf转换类型和参数类型必须一致么

sprintf() 和 sscanf()