R中“!is.null()”的替代

时间:2010-02-01 09:54:53

标签: r

我的R代码最终包含多种形式的陈述:

if (!is.null(aVariable)) { 
     do whatever 
}

但这种陈述难以阅读,因为它包含两个否定。我更喜欢这样的东西:

 if (is.defined(aVariable)) { 
      do whatever 
 }

与!is.null相反的is.defined类型函数是否在R中存在标准?

欢呼声, 的Yannick

6 个答案:

答案 0 :(得分:33)

您最好不要计算出您的函数或代码所接受的值类型,并要求:

if (is.integer(aVariable))
{
  do whatever
}

这可能是对isnull的改进,因为它提供了类型检查。另一方面,它可能会降低代码的通用性。

或者,只需制作您想要的功能:

is.defined = function(x)!is.null(x)

答案 1 :(得分:15)

如果这只是一个易于阅读的问题,你可以随时定义自己的功能:

is.not.null <- function(x) !is.null(x)

所以你可以在整个程序中使用它。

is.not.null(3)
is.not.null(NULL)

答案 2 :(得分:7)

伊恩把这个放在评论中,但我认为这是一个很好的答案:

if (exists("aVariable"))
{
  do whatever
}

请注意引用变量名称。

答案 3 :(得分:2)

我也看到了:

if(length(obj)) {
  # do this if object has length
  # NULL has no length
}

我认为那不是很好。因为某些向量的长度可以为0。character(0)logical(0)integer(0),因此可以将其视为NULL而不是错误。

答案 4 :(得分:1)

shiny包提供了方便的函数validate()need(),用于检查变量是否可用且有效。 need()评估表达式。如果表达式无效,则返回错误消息。如果表达式有效,则返回NULL。可以使用它来检查变量是否有效。有关详细信息,请参阅?need

我建议定义一个这样的函数:

is.valid <- function(x) {
  require(shiny)
  is.null(need(x, message = FALSE))  
}

如果is.valid()FALSExFALSENULL,则此功能NA将返回NaN,空字符串"",空原子向量,仅包含缺失值的向量,仅包含FALSE的逻辑向量或类try-error的对象。在所有其他情况下,它返回TRUE

这意味着,need()(和is.valid())涵盖了非常广泛的失败案例。而不是写:

if (!is.null(x) && !is.na(x) && !is.nan(x)) {
  ...
}

可以简单地写一下:

if (is.valid(x)) {
  ...
}

通过检查类try-error,它甚至可以与try()块一起使用来静默捕获错误:(请参阅https://csgillespie.github.io/efficientR/programming.html#communicating-with-the-user

bad = try(1 + "1", silent = TRUE)
if (is.valid(bad)) {
  ...
}

答案 5 :(得分:0)

要处理未定义的变量以及null,可以将substitutedeparse一起使用:

nullSafe <- function(x) {
  if (!exists(deparse(substitute(x))) || is.null(x)) {
    return(NA)
  } else {
    return(x)
  }
}

nullSafe(my.nonexistent.var)