使用match.arg()进行数字参数匹配

4
match.arg()函数中,为什么choices参数可以是数字,而arg参数的值不能是数字?这个函数是否不应该用于匹配数字参数? match.arg的文档显示如下,但没有提到数字值:

choices - 一个候选值的字符向量

好的,但在下面的示例中没有数字。
f <- function(year){
    match.arg(year, choices = 1995:2005)
}

f(2000)
# Error in match.arg(year, 1995:2005) : 
#  'arg' must be NULL or a character vector

g <- function(year){
   match.arg(as.character(year), choices = 1995:2005)
}

g(2000)
# [1] 2000

那么一个字符字符串刚好匹配了一个数字值...有趣。

我使用这个函数的目的是确定用户输入的 year 是否是一个大的年份向量的成员,这个向量不一定是一个序列(有些年份可能会缺失)。

还要注意,year = NULL 在这里对我没有用,因为在我的实际数据中,这意味着默认年份将是1871年,而我不想要这个。


choices参数是为了让您缩小具有多个参数的函数的参数列表。您似乎没有理解它应该做什么。它不应该被用作常规向量的开关案例函数。 - IRTFM
我认为 choices 参数是为了确保 arg 是可能的选项之一,并将其分配为这样... 像在 if 语句中使用,对吧?我已进行了编辑以提高清晰度。 - Rich Scriven
我仍然不清楚为什么你不使用 year %in% choices - IRTFM
我可以这样做。我也在看 is.element(year, choices)。有没有更喜欢的匹配数字参数的方法?这是大数据,所以我试图尽快得到结果。 - Rich Scriven
在我看到的速度比较中,%in% 的表现非常出色。它实际上只是 match 的一个包装器,而 match 是用 C 优化过的。我不会期望 match.args 在这种情况下有很好的竞争力。 - IRTFM
1个回答

6

match.arg的片段

else if (!is.character(arg)) 
        stop("'arg' must be NULL or a character vector")

没有尝试强制转换为字符串。

来自?match.arg

匹配是使用pmatch进行的,因此arg可能会被缩写。

来自?pmatch参数部分

x
要匹配的值:通过as.character转换为字符向量。支持长向量。

因此,使用match.arg,用户不能使用数字arg,但可以使用数字choices向量。我的经验是5"5"不同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接