Список ввода в sprintf (обойти функцию многоточия...)

Можно ли как-то передать функцию sprintf(fmt, ...) в R списком или data.frame вместо отдельных векторов?

например, чего я хочу добиться:

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 ответа

Решение

Вы можете сделать это функцией и использовать do.call применять, т.е.

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

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

Мы также можем использовать без анонимного вызова функции

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"
Другие вопросы по тегам