2017-05-21 20 views
5

是否可以通過list或data.frame來提供R的sprintf(fmt,...)函數而不是單獨的向量?列表輸入到sprintf(繞過省略號...函數)

例如,我想達到的目標:

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,使得代碼醜陋。

我想更普遍的問題是如何規避省略號...的功能。

我肯定不是第一個問這個,但我找不到在這個方向上東西..

回答

9

你可以把它的功能和使用do.call申請,即

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

do.call(f1, df) 
#[1] "xaa A08" "xbbBB09" "x c C10" 
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" 
+7

IMO這是基本相同@Sotos的回答 – Jaap

+1

非常有用指出如何在do.call C()多ARGS結合的功能。請參閱do.call文檔中的示例。簡潔。將使用該。謝謝 – user6105723