我发现这种行为非常令人困惑:
choose_language <- function(language = c("R", "python", "C")) {
language <- match.arg(language, several.ok = FALSE)
paste('I love', language)
}
choose_language(language = "R")
"I love ">
choose_language(language = c("R", "python"))
Error in…好的
choose_language(language = c("R", "python", "C"))
"I love ">
为什么会这样?
我期望与以下函数相同的行为:
choose_language <- function(language = "R") {
checkmate::assertChoice(language, choices = c("R", "python", "C"))
paste('I love', language)
}
但不依赖checkmate
在choose_language()
函数中使用match.arg()
是正确的,但它是match.arg()
的单参数形式。请专门查看文档:
"在单参数形式match.arg(arg)中,选择是从匹配的函数的形式参数arg的默认设置中获得的。Arg被叫来了。(因为默认的参数匹配会将arg设置为choices,所以这被允许作为' length 1 '的例外,除非是几个。ok是TRUE '规则,并返回第一个元素。)">
如果你更新你的函数,显式地包括choices
参数,像这样
choose_language <- function(language = c("R", "python", "C")) {
language <- match.arg(arg=language, choices = language, several.ok = FALSE)
paste('I love', language)
}
,那么您会发现上面的所有示例都返回"I love R"
'