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
)。
我写了一个小函数,将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] 删除。
我来说两句