
[英]How do I efficiently use different arguments for a custom function that relies on dplyr?
[英]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
等,然后使用unlist
和unique
,但找不到任何适用于此处的列表替换功能。
我想你可以只使用一个命名列表,然后索引该列表:
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.