我想编写一个函数,将两种不同的统计方法之一应用于其输入。 在这个过程中,我注意到了一些我不理解的不同功能的行为。 我想写的函数应该具有以下属性:
基本上,我希望函数的行为与R中的cor
一样。在那里,您有一个默认值method = c("pearson", "kendall", "spearman")
,如果method
不是&#39,函数会计算出Pearson相关性; t指定。如果用户一次请求多个方法,则该函数返回错误。
从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
我不明白这种行为,如果你能帮助我,我会很高兴的。 从我在Google上的尝试中,我意识到它可能与非标准评估有关,但我还不能将两个和两个放在一起。
提前致谢,非常感谢您的帮助!
干杯!
修改
我还可以重新说出我的问题:
cor
在没有提供method
的情况下返回Pearson相关性时,method = c("pearson", "kendall", "spearman")
做了什么强大的法术,但是当明确指定{{1}}时它会返回错误?
答案 0 :(得分:8)
如果choices
中的args
和match.arg
相同,则会返回第一个元素。否则arg
的长度必须为1. match.arg
:
由于默认参数匹配会将arg设置为选项,因此允许将此作为“长度为1的例外,除非”。是“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))
}
答案 1 :(得分:1)
@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
中的异常,通过该异常向函数提供向量可能不导致错误。
相反,会立即发出此错误。