繁体   English   中英

匹配使用match.arg()的默认值向量,有或没有错误[R]

[英]Matching vector of default values using match.arg() with or without error [R]

我想编写一个函数,将两种不同的统计方法之一应用于其输入。 在这个过程中,我注意到了一些我不理解的不同功能的行为。 我想写的函数应该具有以下属性:

  • 它应该有一个向量作为默认值(这样用户可以看到哪些方法可用)
  • 如果参数保留为默认值,则应使用两种方法中的第一种
  • 如果用户手动提供方法向量,则该函数应该给出错误

基本上,我希望函数的行为与R中的cor一样。在那里,你有一个默认值method = c("pearson", "kendall", "spearman") ,如果method不是,则函数计算出Pearson相关性指定。 如果用户一次请求多个方法,则该函数返回错误。

通过查看cor ,这似乎是使用match.arg(method) 此行为如下所示:

x <- y <- 1:5

cor(x, y, method="pearson")
# = 1
cor(x, y, method="kendall")
# = 1
cor(x, y, method=c("pearson","kendall"))
# gives an error

我尝试编写自己的函数,也使用match.arg(method) ,但我意识到结果有些不同。 即使为method选择向量,该函数也不会以错误终止,而是返回第一个方法的结果。

这在这里说明:

myfun <- function(x, method=c("add","multiply")){
  method <- match.arg(method)
  if(method=="add") return(sum(x))
  if(method=="multiply") return(prod(x))
}

x <- 1:5

myfun(x, method="add")
# = 15
myfun(x, method="multiply")
# = 120
myfun(x, method=c("add","multiply"))
# = 15

我不明白这种行为,如果你能帮助我,我会很高兴的。 从我在谷歌的尝试中,我意识到它可能与非标准评估有关,但我还不能把两个和两个放在一起。

在此先感谢,非常感谢您的帮助!

干杯!

编辑:

我也可以重新说出我的问题:

没有什么强大的巫术cor做它返回时Pearson相关method没有提供,但是当它返回一个错误method = c("pearson", "kendall", "spearman")明确规定?

如果match.arg choicesargs相同,则返回第一个元素。 否则arg必须是长度1.来自match.arg

由于默认参数匹配会将arg设置为选项,因此允许将此作为​​“length one除非:many.ok为TRUE”规则的例外,并返回第一个元素。

match.arg(c("pearson", "kendall", "spearman"), c("pearson", "kendall", "spearman"))
## [1] "pearson"
match.arg(c("pearson", "kendall"), c("pearson", "kendall", "spearman"))
## Error in match.arg(c("pearson", "kendall"), c("pearson", "kendall", "spearman")) : 
##  'arg' must be of length 1

您可以使用伪参数获得所需的行为:

myfun <- function(x, method=c("add","multiply","other.return.error")){
  method <- match.arg(method)
  if("other.return.error" %in% method) stop("this option should not be used")
  if(method=="add") return(sum(x))
  if(method=="multiply") return(prod(x))
}

@shadow回答了主要问题(见上文)。

获得myfun所需行为的另一种方法是执行检查是否提供method ,如果显式提供了多个元素,则打印错误。

myfun <- function(x, method=c("add","multiply")){
  if(!missing(method) & length(method)>1) stop("Only one 'method' allowed.")
  method <- match.arg(method)
  if(method=="add") return(sum(x))
  if(method=="multiply") return(prod(x))
}

x <- 1:5

myfun(x)
# = 15
myfun(x, method="add")
# = 15
myfun(x, method="multiply")
# = 120
myfun(x, method=c("add","multiply"))
# gives error

这绕过了@shadow指出的match.arg的异常,通过该异常向函数提供向量可能不会导致错误。 相反,这个错误立即给出。

暂无
暂无

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

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