gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 17:57:25 25 4
gpt4 key购买 nike

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

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

基本上,我希望该函数的行为与 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),但我意识到结果有些不同。即使为方法选择向量,该函数也不会因错误而终止,而是返回第一个方法的结果。

如下所示:

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") 是否明确指定?

最佳答案

如果 match.arg 中的 choicesargs 相同,则返回第一个元素。否则 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))
}

关于r - 使用 match.arg() 匹配默认值向量,有或没有错误 [R],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28944623/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com