用相同的值替换Sprintf中的多个变量

时间:2018-03-05 12:54:23

标签: r string format

我希望将已定义的变量插入到R中的字符串中,其中变量将插入多个位置。

我看到sprintf可能有用。

所需输入的示例:

a <- "tree"
b <- sprintf("The %s is large but %s is small. %s", a) 

理想输出会返回

"The tree is large but tree is small. tree"

我知道我可以使用这样的功能:

b <- sprintf("The %s is large but %s is small. %s",a,a,a)

然而,对于我的实际工作,我需要插入10次以上,所以我正在寻找更清洁/更简单的解决方案。

gsub会成为更好的解决方案吗?

我的确切问题已经在这里得到解答,但它是针对语言Go:

Replace all variables in Sprintf with same variable

3 个答案:

答案 0 :(得分:3)

1) 胶水我们可以使用glue。除glue

外,不使用任何包
glue::glue("The {s} is large but {s} is small. {s}", s = a)
#The tree is large but tree is small. tree

2 语法语法类似于python中的f-string方法

a = "tree"
print(f"The {a} is large but {a} is small. {a}")
#The tree is large but tree is small. tree

类似于format方法,但更具可读性

print("The {s} is large but {s} is small. {s}".format(s=a))
#The tree is large but tree is small. tree

答案 1 :(得分:3)

1)do.call 使用do.call可以使用a构建rep个参数。没有包使用。

a <- "tree"
s <- "The %s is large but %s is small. %s"

k <- length(gregexpr("%s", s)[[1]])
do.call("sprintf", as.list(c(s, rep(a, k))))
## [1] "The tree is large but tree is small. tree"

2)gsub 评论中已经提到过这一点,但可以使用gsub。同样,没有使用包。

gsub("%s", a, s, fixed = TRUE)
## [1] "The tree is large but tree is small. tree"

3)gsubfn gsubfn包支持准perl样式字符串插值:

library(gsubfn)

a <- "tree"
s2 <- "The $a is large but $a is small. $a"
fn$c(s2)
## [1] "The tree is large but tree is small. tree"

此外,反引号可用于包含整个R表达式,这些表达式在。

中进行求值和替换

这可以与任何函数一起使用,而不仅仅是c导致非常紧凑的代码。例如,假设我们想要在替换后计算s 中的字符数。然后就可以这样做:

fn$nchar(s2)
## [1] 38

答案 2 :(得分:2)

这是一个实际的sprintf()解决方案:

public sealed class Repository<T> : IRepository<T> where T : class {
    private readonly ISession session;

    public Repository(ISession session) {
        this.session = session ?? throw new ArgumentNullException(nameof(session));
    }

 ...
}

官方sprintf()文档中有更多示例。