列表输入到sprintf(绕过省略号...函数)

时间:2017-05-21 18:36:43

标签: r printf ellipsis

以某种方式可以用列表或data.frame而不是单独的向量来提供R的sprintf(fmt,...)函数吗?

例如,我想要实现的目标:

df <- data.frame(v1 = c('aa','bb','c'), 
                 v2 = c('A', 'BB','C'),  
                 v3 = 8:10, 
                 stringsAsFactors = FALSE)

sprintf('x%02s%02s%02i', df[[1]], df[[2]], df[[3]])
[1] "xaa A08" "xbbBB09" "x c C10"

但使用更简洁的语法,如:

sprintf('x%02s%02s%02i', df)
Error in sprintf("x%02s%02s%02i", df) : too few arguments

在我的实际情况中,我有更多列供应sprintf,使代码变得丑陋。

我想更普遍的问题是如何规避省略号...功能。

我肯定不是第一个问这个问题的人,但我找不到任何方向......

2 个答案:

答案 0 :(得分:10)

你可以使它成为一个函数并使用do.call来应用,即

f1 <- function(...){sprintf('x%02s%02s%02i', ...)}

do.call(f1, df)
#[1] "xaa A08" "xbbBB09" "x c C10"

答案 1 :(得分:2)

我们也可以在没有匿名函数调用的情况下使用

do.call(sprintf, c(df, fmt = 'x%02s%02s%02d'))
#[1] "xaa A08" "xbbBB09" "x c C10"

或另一种选择是

library(stringr)
paste0('x', do.call(paste0, Map(str_pad, df, width = 2, pad = c(' ', ' ', '0'))))
#[1] "xaa A08" "xbbBB09" "x c C10"