在R中,一个返回NA、NULL或NaN为TRUE的函数?

23

在R中是否有像这样的函数:

isnothing = function(x) {
    is.null(x) | is.na(x) | is.nan(x)
}

4
我认为没有一个基本函数可以做到这一点。NULL和NA是两个完全不同的东西,你提出的测试混淆了这两个概念。 - shadow
这样一个函数的目的是在处理经验不足和/或无能力的用户时进行防御性编程,而在 R 社区中这种用户很多。 - Backlin
1
@Backlin在这种情况下的首选防御应该是RTFM。我认为教育社区比假设他们愚蠢更好(但对于您的函数+1)。 - Simon O'Hanlon
6
@SimonO101,大部分情况下我同意。但在一些明显意图为制作图表等琐事中,我认为与其在工作场所纠结语法问题,还不如顺其自然。他们运行我的代码越顺畅,就越可能会这样做。请让我做到最好。 - Backlin
3个回答

17

我也一直缺少这样的功能,因此很久以前就将其添加到我的.Rprofile中。如果有人知道一个能够完成同样任务的基本函数,请告诉我。

is.blank <- function(x, false.triggers=FALSE){
    if(is.function(x)) return(FALSE) # Some of the tests below trigger
                                     # warnings when used on functions
    return(
        is.null(x) ||                # Actually this line is unnecessary since
        length(x) == 0 ||            # length(NULL) = 0, but I like to be clear
        all(is.na(x)) ||
        all(x=="") ||
        (false.triggers && all(!x))
    )
}

如@shadow所提到的那样,NANaNNULL具有不同的含义,理解这点很重要。然而,当我制作包含可选参数默认值的函数,并希望用户通过将它们设置为任何“未定义”值来禁用它们时,我发现这个函数非常有用。

其中一个例子是plotxlab。我永远记不住是xlab=NAxlab=FALSExlab=NULL还是xlab=""。有些会产生想要的结果,有些则不会,因此我在编写代码时发现使用上述函数对于我来说非常方便,特别是如果其他人也要使用它。


8

我相信您基本上是在寻找gtools invalid()函数的作用。

 ?gtools::invalid

例如,
gtools::invalid(NA)
[1] TRUE
gtools::invalid(NULL)
[1] TRUE
gtools::invalid(NaN)
[1] TRUE

1

我也遇到了非常类似的问题。我想检查给定矩阵或数据框的行名是否合适。

x <- matrix(1:6,ncol=2)
isnothing = function(x) {
  any(is.null(x))  | any(is.na(x))  | any(is.nan(x)) 
}
isnothing(rownames(x))

该函数将抛出一个错误。但当我使用短路计算并将其更改为:
isnothing = function(x) {
  any(is.null(x))  || any(is.na(x))  || any(is.nan(x)) 
}
isnothing(rownames(x))

它解决了我的问题。我猜先检查是否为null,然后继续检查其他情况,如果为FALSE,则解决了我的问题。我用几个有问题的案例进行了检查,并且它起作用了。我不知道是否有例外情况,但目前它对我的目的起作用了。
rownames(x) <- c("a",NaN,NA)
isnothing(rownames(x))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接