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

我的R代码最终包含了过多的表单语句:

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

但是这种说法很难理解,因为它包含了两个否定。 我宁愿像这样的东西:

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

在R中是否存在与is.null相反的is.definedtypes的函数?

欢呼声,扬尼克

你可能会更好地研究你的函数或代码接受什么样的值,并且要求:

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

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

或者,只需制作你想要的function:

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

如果只是一个容易阅读的问题,你可以随时定义你自己的function:

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

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

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

Ian在评论中提到了这一点,但我认为这是一个很好的答案:

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

请注意variables名称被引用。

shiny包提供了方便的函数validate()need()来检查variables是否可用和有效。 need()评估一个expression式。 如果expression式无效,则返回错误消息。 如果expression式有效,则返回NULL 。 可以用这个来检查一个variables是否有效。 请参阅?need更多信息。

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

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

如果xFALSENULLNANaN ,一个空string"" ,一个空的primefaces向量,一个只包含缺失值的向量,一个只包含FALSE的逻辑向量,或者一个对象,则该函数返回FALSEtry-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用户; )

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