在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中是否有相同的内容,或者您找到了一个好的解决方法?
答案 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))
}