如果传递给函数的参数不是必需的类型(字符)
,我想返回错误消息if (!typeof(param1) == "character" || !typeof(param2) == "character") {
stop("You must provide valid arguments")
}
这仅在我提供无效参数时才有效。如果缺少某些参数,如何确保显示消息,因为如果我在没有任何参数的情况下调用该函数则不起作用?
答案 0 :(得分:4)
您可以使用missing()
检查是否提供了参数。这比其他答案更受欢迎,这些答案建议使用与预期类型不同的默认值(多么令人困惑!)。只有在有默认值时才使用默认值。
另外,一般来说,使用typeof()
进行类型检查并不是一个好主意。 typeof()
函数返回数据在R实现中的存储方式。通常,函数关心对象是否呈现与该类对应的特定API。要检查继承,请使用is()
。但在这种情况下,为了便于阅读和遵循惯例,请考虑使用is.character()
。
所以你可能有类似的东西:
if (missing(param1) || !is.character(param1)) {
stop("'param1' must be provided as a character vector")
}
另外,在检查向量时要记住的事项:
您可能会发现为此定义帮助程序很有用,例如Bioconductor中的S4Vectors包中的此函数:
isSingleString <- function (x)
{
is.character(x) && length(x) == 1L && !is.na(x)
}
然后:
if (missing(param1) || !isSingleString(param1)) {
stop("param1 must be a single, non-NA string")
}
答案 1 :(得分:1)
stopifnot
,它旨在检查参数。这里我将如何做到这一点:
func_check <-
function(param1="",param2=""){
stopifnot(typeof(param1) == "character",
typeof(param2) == "character")
}
## param2 is numeric
func_check(param1= 'a',param2=2)
## param2 is missing
func_check(param1= 1)
如果您想检查缺失值,玩具shoudl使用点状参数。然后,您可以使用match.call
处理它。这里是我测试缺失而不是有效参数的示例。
func_check <-
function(...){
ll <- as.list((match.call()[-1]))
stopifnot(c('param1','param2' )%in% names(ll))
param1 = ll$param1
param2 = ll$param2
stopifnot(typeof(param1) == "character",
typeof(param2) == "character")
}
func_check(param1= 'a',param2=2)
答案 2 :(得分:0)
如果我定义以下功能:
myfunc <- function(param1, param2, numeric1, param3) {
if (!is.character(param1) || !is.character(param2)) {
stop("You must provide valid arguments for param1 and param2")
} else if(!is.numeric(numeric1)) {
stop("Please provide numeric input")
} else if(!is.character(param3)){
stop("Please provide character input for param3")
}
#some code here for your function, e.g.
paste0(param1, param2, numeric1, param3)
}
每当我在myfunc
的调用中没有给它4个输入参数时,它会抛出一个错误,包括我是否在没有任何参数的情况下调用它(所以如果缺少aguments并且它们不是正确的类型)。这与你想要的有什么不同?