是否有sprintf变体,其中(仅)向量的元素用于所有%扩展?

时间:2019-07-19 14:13:55

标签: r printf

我想知道R中是否有一种通用方法可以从模板创建字符向量,而另一个向量的值可以任意扩展多次。

也就是说,我正在寻找一个tq84(template, vec)之类的函数,该函数可以用tq84('foo_%d, bar_%d, baz_%d', 1:2)调用,然后生成向量"foo_1, bar_1, baz_1", "foo_2, bar_2, baz_2"。请注意,所得向量的长度应等于输入向量的长度。

3 个答案:

答案 0 :(得分:2)

也许我们可以使用wwwroot

rep

如果我们需要一个与预期输出完全匹配的字符串

tq84 <- function(template, vec) {
             paste(template, rep(vec, each = length(template)), sep="_")
 }
v1 <- c("foo", "bar", "baz")
tq84(v1, 1:2)
#[1] "foo_1" "bar_1" "baz_1" "foo_2" "bar_2" "baz_2"

或者另一种选择是使用tq84n <- function(template, vec) { sapply(as.list(vec), function(x) paste(template, x, sep="_", collapse=" ")) } tq84n(v1, 1:2) #[1] "foo_1 bar_1 baz_1" "foo_2 bar_2 baz_2" 然后执行crossing group_by

paste

答案 1 :(得分:1)

也许,我们可以将outerpaste一起使用

vec <- c("foo", "bar", "vec")
c(outer(vec, 1:2, paste, sep = "_"))
#[1] "foo_1" "bar_1" "vec_1" "foo_2" "bar_2" "vec_2"

或者,如果您想将它们分开,则可以跳过c

outer(vec, 1:2, paste, sep = "_")

#        [,1]    [,2]   
#[1,] "foo_1" "foo_2"
#[2,] "bar_1" "bar_2"
#[3,] "vec_1" "vec_2"

或者与期望的输出完全匹配

apply(outer(vec, 1:2, paste, sep = "_"), 2, paste, collapse = ", ") 
#[1] "foo_1, bar_1, vec_1" "foo_2, bar_2, vec_2"

答案 2 :(得分:1)

返回列表的Map替代项:

     tq84 <- function(vec, numbers){
   Map(function(x)
     paste0(vec[x],"_",numbers),
     seq_along(vec))
 }
 foobar <- c("foo","bar","baz")
 tq84(foobar,1:2)
[[1]]
[1] "foo_1" "foo_2"

[[2]]
[1] "bar_1" "bar_2"

[[3]]
[1] "baz_1" "baz_2"