R 最大输入长度
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 (
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 );"