检查数据类型是否合适,如果没有则返回错误消息

时间:2014-06-01 11:51:29

标签: r

如果传递给函数的参数不是必需的类型(字符)

,我想返回错误消息
if (!typeof(param1) == "character" || !typeof(param2) == "character") {
    stop("You must provide valid arguments")
  }

这仅在我提供无效参数时才有效。如果缺少某些参数,如何确保显示消息,因为如果我在没有任何参数的情况下调用该函数则不起作用?

3 个答案:

答案 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)

  1. 为了确保没有带有misisng参数的问题,您应该提供默认参数。
  2. 使用stopifnot,它旨在检查参数。
  3. 这里我将如何做到这一点:

    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并且它们不是正确的类型)。这与你想要的有什么不同?