sprintf格式字符串:按名称引用?

时间:2013-07-04 17:42:08

标签: r

在Python中,您可以按名称指定字符串格式(这当然是一个愚蠢的例子):

parameters = {'label':'months', 'april':4,'may':5,'june':6}
formatstring = '%(label)s: %(april)d %(may)d %(june)d'
outputstring = formatstring % parameters

formatstring % parameters符号是R等价于do.call(sprintf,c(formatstring,as.list(parameters)))的Python。)

输出字符串为“months: 4, 5, 6”。参数存储为键值对(可以称为各种语言的字典,哈希表或命名列表)。字符串格式%(text)s允许您引用应在该插槽中格式化的字典项(text)。

R中是否有相同的内容,或者您​​找到了一个好的解决方法?

2 个答案:

答案 0 :(得分:13)

1。gsubfn package中尝试gsubfn

library(gsubfn)
parameters <- list(label = "months", april = 4, may = 5, june = 6)

gsubfn("\\w+", parameters, "label: april, may, june")

2。或从同一个套餐中尝试fn$

with(parameters, fn$identity("$label: $april, $may, $june"))

3. 这是一个简短的中缀函数,它将格式字符串和参数列表转换为sprintf,然后运行它:

library(gsubfn)
`%format%` <- function(fmt, list) {
    pat <- "%\\(([^)]*)\\)"
    fmt2 <- gsub(pat, "%", fmt)
    list2 <- list[strapplyc(fmt, pat)[[1]]]
    do.call("sprintf", c(fmt2, list2))
}

像这样使用:

> '%(label)s: %(april)d %(may)d %(june)d' %format% parameters
[1] "months: 4 5 6"

答案 1 :(得分:1)

尽管此功能未内置到R正在使用的系统Glass中(请参见5,以获取系统文档),但通过替换命名的引用在R中实现这样的功能就很容易了各自的位置-

sprintf

这是用法示例:

man printf

我们也可以将其设为中缀:

sprintf_named <- function(fmt, ...) {
  args <- list(...)
  argn <- names(args)
  if(is.null(argn)) return(sprintf(fmt, ...))

  for(i in seq_along(args)) {
    if(argn[i] == "") next;
    fmt <- gsub(sprintf("%%{%s}", argn[i]), sprintf("%%%d$", i), fmt, fixed = TRUE)
  }

  do.call(sprintf, append(args, fmt, 0))
}