我的R代码最终包含多种形式的陈述:
if (!is.null(aVariable)) {
do whatever
}
但这种陈述难以阅读,因为它包含两个否定。我更喜欢这样的东西:
if (is.defined(aVariable)) {
do whatever
}
与!is.null相反的is.defined
类型函数是否在R中存在标准?
欢呼声, 的Yannick
答案 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()
为FALSE
,x
,FALSE
,NULL
,则此功能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,可以将substitute
与deparse
一起使用:
nullSafe <- function(x) {
if (!exists(deparse(substitute(x))) || is.null(x)) {
return(NA)
} else {
return(x)
}
}
nullSafe(my.nonexistent.var)