【问题标题】:How to efficiently replace arguments in a function?如何有效地替换函数中的参数?
【发布时间】:2020-03-26 08:09:20
【问题描述】:

我正在开发一个函数,该函数的参数可以采用0:2 中的任意值组合

此参数基于prop.table 函数的“边距”系统,但对其进行了扩展,使其可以采用多个值:0 是单元格,1 是行,2 是列,但 1:2 是行和列0:2 是行、列和单元格。

我想澄清这个符号,以便margin 可以在c("all", "line", "column", "cell", 0, 1, 2) 中取其值,以及向后兼容所需的最后一个值。

这是我使用switch 的尝试(我听说应该避免):

ff = function(x, margin=c("all", "line", "column", "cell", 0, 1, 2)){
    if(!is.numeric(margin)){
        margin = switch(margin,
                        all = 0:2,
                        line = 1,
                        column = 2,
                        cell = 0)
        if(is.null(margin)) margin=0:2 #defaulting 
    }
    margin
}


ff(NULL, margin=1:2)
ff(NULL, margin="all")
ff(NULL, margin="cell")
ff(NULL, margin=c("column", "cell")) #error in switch (EXPR must be a length 1 vector)

如果边距有一个意外的值,它将默认为 0:2。我宁愿使用match.arg,但我无法让它接受向量。此外,就像现在一样,默认向量将被强制转换为字符。

我也想过用0:2 等替换“全部”,然后使用unlistunique,但找不到任何在这里工作的列表替换功能。

【问题讨论】:

    标签: r function replace arguments


    【解决方案1】:

    我认为你可以只使用一个命名列表,然后索引该列表:

    ff = function(x, margin=c("all", "line", "column", "cell", 0, 1, 2)){
      if(!is.numeric(margin)){
        if(is.null(margin)) {
          margin=0:2 #defaulting 
        } else {
          marginopts = list(all = 0:2,
                            line = 1,
                            column = 2,
                            cell = 0)
          margin <- unname(unlist(marginopts[margin]))
        }
      }
      margin
    }
    ff(NULL, margin=1:2) # [1] 1 2
    ff(NULL, margin="all") # [1] 0 1 2
    ff(NULL, margin="cell") # [1] 0
    ff(NULL, margin=c("column", "cell")) # [1] 2 0
    ff(NULL, margin=NULL) # [1] 0 1 2
    

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2016-02-05
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 2017-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多