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

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

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

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

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 选择向量时,该函数也不会因错误而终止,而是 returns 第一种方法的结果。

这里有说明:

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

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

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

干杯!

编辑:

我也可以重新表述我的问题:

什么强大的魔法 cor 做到了 returns 没有提供 method 时的 Pearson 相关性,但 returns 当 method = c("pearson", "kendall", "spearman") 时出现错误] 是否明确指定?

如果choicesargsmatch.arg中相同,则返回第一个元素。否则 arg 的长度必须为 1。来自 match.arg:

Since default argument matching will set arg to choices, this is allowed as an exception to the ‘length one unless several.ok is TRUE’ rule, and returns the first element.

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 并在 显式 [=22= 时打印错误] 提供了不止一个元素。

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 中的异常,通过该异常向函数提供向量可能 而不是 导致错误。 相反,会立即给出此错误。