列出 sprintf 的输入(绕过省略号 ... 函数)
list input to sprintf (circumvent the ellipsis ... function)
是否可以通过某种方式为 R 的 sprintf(fmt, ...) 函数提供列表或 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,使代码变得难看。
我想更普遍的问题是如何绕过省略号 ...
函数。
我肯定不是第一个问这个问题的人,但我在这方面找不到任何东西..
你可以把它做成一个函数然后用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"
是否可以通过某种方式为 R 的 sprintf(fmt, ...) 函数提供列表或 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,使代码变得难看。
我想更普遍的问题是如何绕过省略号 ...
函数。
我肯定不是第一个问这个问题的人,但我在这方面找不到任何东西..
你可以把它做成一个函数然后用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"