Sim*_*onG 8 evaluation arguments r function match
我想编写一个函数,将两种不同的统计方法之一应用于其输入.在这个过程中,我注意到了一些我不理解的不同功能的行为.我想写的函数应该具有以下属性:
基本上,我希望函数的行为与corR中的函数类似.在那里,您有一个默认值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
Run Code Online (Sandbox Code Playgroud)
我尝试编写自己的函数,也使用了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
Run Code Online (Sandbox Code Playgroud)
我不明白这种行为,如果你能帮助我,我会很高兴的.从我在谷歌的尝试中,我意识到它可能与非标准评估有关,但我还不能把两个和两个放在一起.
在此先感谢,非常感谢您的帮助!
干杯!
编辑:
我也可以重新说出我的问题:
什么强大的巫术确实cor会在method没有提供时返回Pearson相关性,但是在method = c("pearson", "kendall", "spearman")明确指定时会返回错误?
如果choices和args相同match.arg,则返回第一个元素.否则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
Run Code Online (Sandbox Code Playgroud)
您可以使用伪参数获得所需的行为:
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))
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6608 次 |
| 最近记录: |