在R中替代“!is.null()”
我的R代码最终包含了过多的表单语句:
if (!is.null(aVariable)) { do whatever }
但是这种说法很难理解,因为它包含了两个否定。 我宁愿像这样的东西:
if (is.defined(aVariable)) { do whatever }
在R中是否存在与is.null相反的is.defined
types的函数?
欢呼声,扬尼克
你可能会更好地研究你的函数或代码接受什么样的值,并且要求:
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)) }
如果x
是FALSE
, NULL
, NA
, NaN
,一个空string""
,一个空的primefaces向量,一个只包含缺失值的向量,一个只包含FALSE
的逻辑向量,或者一个对象,则该函数返回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用户; )
bad = try(1 + "1", silent = TRUE) if (is.valid(bad)) { ... }