R 最大输入长度

R 最大输入长度,r,replace,R,Replace,R的sprintf预设最大输入长度设置为8192字节: sprintf(x, y) Error in sprintf(x, y) : 'fmt' length exceeds maximal format length 8192 长输入字符串的解决方法是什么?我了解到在C语言中有用于这种情况的函数,但在R语言中似乎没有,不是吗 范例 输入文件类似于 select * from some_table where a = '%s' and b = %d and c in (

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

sprintf(x, y)
Error in sprintf(x, y) : 'fmt' length exceeds maximal format length 8192
长输入字符串的解决方法是什么?我了解到在C语言中有用于这种情况的函数,但在R语言中似乎没有,不是吗

范例

输入文件类似于

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

但要复杂得多,时间也长得多。我需要用一些值替换所有的值<代码>sprintf在这方面很好,但是我正在使用的一个输入脚本太长了。我需要替换多个不同的参数,这些参数具有不同的格式(字符串、双精度、浮点)。要替换的值位于输入文件的不同部分,因此我需要按给定顺序搜索和替换它们。我知道要参数化查询,但需要使用不同的库(
RPostgreSQL
)。

我编写了一个小函数,将
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)
}


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

例如,您有时可能需要使用
粘贴
等函数来替换
sprintf
。你不能做一个具体的最小示例吗?进一步参数化你的格式字符串?@James我不明白你的意思..?例如,
select*from long\u table\u name其中…
变成
select*from%s其中…
@James这个示例类似于我现实生活中的问题,有字符串和数字需要替换,在大多数情况下,替换值是短字符串(例如
> 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 );"