繁体   English   中英

如何有效地替换函数中的参数?

[英]How to efficiently replace arguments in a function?

我正在研究一个函数,该函数的参数可以采用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)

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

我还考虑过将“全部”替换为0:2等,然后使用unlistunique ,但找不到任何适用于此处的列表替换功能。

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

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

希望这可以帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM