Список ввода в 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"