R sprintf最大输入长度

提姆

R的sprintf预设最大输入长度设置为8192字节:

sprintf(x, y)
Error in sprintf(x, y) : 'fmt' length exceeds maximal format length 8192

较长的输入字符串的解决方法是什么?我了解到在C中有针对此类情况的snprintf函数,但这似乎在R中不可用,不是吗?

例子

输入文件是这样的

select *
from some_table
where a = '%s' and
      b = %d and
      c in (%s) and
      d = %s and
      e >= %0.2f

复杂得多,还要更长。我需要将所有值替换为某些值。sprintf很好,但是我正在使用的输入脚本之一太长。我需要替换多个不同的参数,并且参数具有不同的格式(字符串,双精度,浮点型)。要替换的值位于输入文件的不同部分,因此我需要按给定的顺序搜索和替换它们。我知道这种用于参数化查询的方法,但是需要使用其他库(RPostgreSQL)。

mra68

我写了一个小函数,将fmt参数切成较小的部分,查找与%...表达式关联的变量,然后调用sprintf这些部分中的每一个。match.call用于获取隐藏在中的参数...sprintf之所以被称为是do.call因为,是因为先验的我们不知道哪个进一步的争论...属于当前的fmt功能根本不完美。例如,到目前为止,fmt已被切成固定长度的片段。通常,这是行不通的,因为您必须保持%...表达式完好无损。为了查看它是否有效,我将结果保留为字符串列表。

f <- function(N, fmt, ...)
{
  cl <- as.list(match.call())
  n <- nchar(fmt)
  p <- which(unlist(strsplit(fmt,""))=="%")

  result <- list()

  for ( i in 0:(n%/%N))
  {
    start <- i*N+1
    end   <- min((i+1)*N,n)
    fm <- substr(fmt,start,end)
    k <- which(p %in% (start:end))
    v <<- c(list(fm),cl[k+3])
    result[[i+1]] <- do.call("sprintf", v )
  }

  return(result)
}

一个使用长度为10的片段的小例子:

> f( 10, "xyz: %i -ää %s 3 %i %f );", 3, "+++", 12, 0.123 )
[[1]]
[1] "xyz: 3 -ä"

[[2]]
[1] "ä +++ 3 12 "

[[3]]
[1] "0.123000 );"

> paste(f( 10, "xyz: %i -ää %s 3 %i %f );", 3, "+++", 12, 0.123 ),collapse="")
[1] "xyz: 3 -ää +++ 3 12 0.123000 );"

也许可以使用正则表达式来检测%...并找到正确的切入点。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章