【问题标题】:list input to sprintf (circumvent the ellipsis ... function)列出 sprintf 的输入(绕过省略号 ... 函数)
【发布时间】:2017-10-21 09:05:39
【问题描述】:

是否有可能以列表或 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,这使得代码很难看。

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

我确定不是第一个问这个问题的人,但我在这个方向上找不到任何东西..

【问题讨论】:

    标签: r printf ellipsis


    【解决方案1】:

    你可以把它做成一个函数,使用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"
      

      【讨论】:

      • imo这与@Sotos的回答基本相同
      • 非常有帮助指出如何在 do.call 中通过 c() 将多个 args 组合到函数中。请参阅 do.call 文档中的示例。简洁的。会用那个。谢谢
      猜你喜欢
      • 2015-09-02
      • 2012-12-26
      • 1970-01-01
      • 1970-01-01
      • 2015-08-24
      • 2016-04-15
      • 2019-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多