10

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

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

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

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

R中是否有任何等价物,或者你找到了一个好的解决方法?

4

2 回答 2

13

1.试试gsubfngsubfn

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.这是一个简短的中缀函数,它将格式字符串和参数列表转换为 asprintf然后运行它:

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"
于 2013-07-04T18:23:54.497 回答
4

虽然这不是sprintfR 使用的系统函数的内置功能(请参阅man printf系统文档),但通过将命名引用替换为它们各自的位置,在 R 中实现这样的功能很容易 -

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))
}

这是一个示例用法:

sprintf_named("%{HIA}s!! %{RYLAH}s", RYLAH="Rock You Like a Hurricane", HIA="Here I Am")
## [1] "Here I Am!! Rock You Like a Hurricane"

我们也可以使它成为一个中缀:

`%format%` <- function(left, right) do.call(sprintf_named, append(right, left, 0))

"%{b}s %{a}s" %format% list(a='ya', b='boo')
## [1] "boo ya"
于 2019-03-29T17:54:05.933 回答