有python的R等价物吗';s string`format`函数?

有python的R等价物吗';s string`format`函数?,r,replace,R,Replace,在python中有一个很好的函数(str.format),它可以很容易地将字符串中的变量(编码方式类似于{variable})替换为存储在dict中的值(使用变量名命名的值)。像这样: vars=dict(animal="shark", verb="ate", noun="fish") string="Sammy the {animal} {verb} a {noun}." print(string.format(**vars)) 鲨鱼萨米吃了一条鱼 R中最简单的解决方案是什么?是否有一个内

在python中有一个很好的函数(str
.format
),它可以很容易地将字符串中的变量(编码方式类似于
{variable}
)替换为存储在dict中的值(使用变量名命名的值)。像这样:

vars=dict(animal="shark", verb="ate", noun="fish")
string="Sammy the {animal} {verb} a {noun}."
print(string.format(**vars)) 
鲨鱼萨米吃了一条鱼

R
中最简单的解决方案是什么?是否有一个内置的等效双参数函数,它接受一个字符串,该字符串中的变量编码为 方法并用命名的
列表
中的命名值替换它们

如果R中没有内置函数,那么发布的包中是否有内置函数

如果发布的包中没有,您将使用什么编写一个


规则:字符串是用编码为“{variable}”的变量提供给您的。变量必须编码为
列表
。我会用我的定制版本回答,但会接受一个比我做得更好的答案。

因为我似乎找不到内置的,甚至找不到具有这种功能的软件包,所以我试着使用我自己的。我的函数依赖于
stringi
包。以下是我的想法:

strformat = function(str, vals) {
    vars = stringi::stri_match_all(str, regex = "\\{.*?\\}", vectorize_all = FALSE)[[1]][,1]
    x = str
    for (i in seq_along(names(vals))) {
        varName = names(vals)[i]
        varCode = paste0("{", varName, "}")
        x = stringi::stri_replace_all_fixed(x, varCode, vals[[varName]], vectorize_all = TRUE)
    }
    return(x)
}
例如:

> str = "Sammy the {animal} {verb} a {noun}."
> vals = list(animal="shark", verb="ate", noun="fish")

> strformat(str, vals)
[1] "Sammy the shark ate a fish."

下面是一个函数,它将
{
}
转换为
,然后使用
brew
软件包(需要安装)中的
brew


如果格式字符串中有任何未标记变量替换的
{
,或者如果有
我找到了另一个解决方案:tidyverse的glue package:

例如:

library(glue)
animal <- "shark"
verb <- "ate"
noun <- "fish"
string="Sammy the {animal} {verb} a {noun}."
glue(string)
Sammy the shark ate a fish.
库(胶水)
animal该软件包几乎完全替代了str_interp的功能。只需稍作调整:

fmt = function(str, vals) {
    # str_interp requires variables encoded like ${var}, so we substitute
    # the {var} syntax here.
    x = stringr::str_replace_all(x, "\\{", "${")
    stringr::str_interp(x, args)
}

我会非常自信地伸出我的脖子说“不”。不是内置于base R中的。在附加包中可能会有类似的东西。对于变量替换(例如brew包),也有类似的事情,但您希望格式完全用这个{name}编码语法,是吗?是;字符串已经为以python为中心的分析而构建,因此我无法更改变量的编码方式。
brew
使用
作为标记。替换
{
}
如果你不期望
我不知道R中的format函数有什么等价物,但是你有一个printf C函数的等价物,它允许你输入你想要打印的内容和变量列表。请参阅
sprintf()
是核心软件包中最接近的一个。它不使用命名的替换组,但可以使用索引组:
sprintf(“%1$s%1$s%2$s%3$s”、“a”、“b”、“c”)
这比我的版本更简洁,但我认为如果它接受variablesTry
form=function(s,L)的
列表将更有用{
e=as.environment(L)
在这种情况下(未测试)。我基于python的字符串格式方法,它实际上不接受dict,而是一个参数列表(可以用星号转换,就像OP现在在编辑中所做的那样!最好使用
和(L,glue(string))
library(glue)
animal <- "shark"
verb <- "ate"
noun <- "fish"
string="Sammy the {animal} {verb} a {noun}."
glue(string)
Sammy the shark ate a fish.
l <- list(animal = "shark", verb = "ate", noun = "fish")
do.call(glue, c(string , l))
Sammy the shark ate a fish.
fmt = function(str, vals) {
    # str_interp requires variables encoded like ${var}, so we substitute
    # the {var} syntax here.
    x = stringr::str_replace_all(x, "\\{", "${")
    stringr::str_interp(x, args)
}
library(glue)

list2env(list(animal="shark", verb="ate", noun="fish"),.GlobalEnv)
string="Sammy the {animal} {verb} a {noun}."
glue(string)

Sammy the shark ate a fish.