Подтвердить что ты не робот

Функция, которая возвращает TRUE на NA, NULL, NaN в R?

Есть ли функция в R, которая ведет себя следующим образом:

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

Ответ 1

Мне также не хватало такой функции и добавила ее в мой .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, NA, NaN и NULL имеют разные значения, которые важны для понимания. Однако я считаю эту функцию полезной, когда я создаю функции, содержащие необязательные аргументы со значениями по умолчанию, которые я хочу разрешить пользователю подавлять, установив их в любое значение "undefined".

Одним из таких примеров является xlab of plot. Я никогда не запомню, если это xlab=NA, xlab=FALSE, xlab=NULL или xlab="". Некоторые из них дают желаемый результат, а некоторые - нет, поэтому я нашел удобным использовать все вышеперечисленные функции при разработке кода, особенно если другие люди тоже его используют.

Ответ 2

У меня тоже была очень похожая проблема. Я пытался проверить, правильны ли имена строк для данной матрицы или фрейма данных.

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))

Он решил мою проблему. Я предполагаю, что проверяю сначала недействительность, а затем отправляюсь проверять другие случаи, если FALSE решила мою проблему. Я проверил это с пара проблемных случаев, о которых я мог думать, и это сработало. Я не знаю, есть ли исключения, но это сработало для моих целей.

rownames(x) <- c("a",NaN,NA)
isnothing(rownames(x))

Ответ 3

Я считаю, что вы в основном ищете функцию gtools invalid().

 ?gtools::invalid

Например,

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

Ответ 4

Рассмотрим is.finite():

!is.finite(NA)
# TRUE
!is.finite(NaN)
# TRUE

Но это не работает для NULL или ввода символа:

!is.finite(NULL)
# logical(0)
!is.finite("foo")
# TRUE

Также (естественно)

!is.finite(Inf)
# TRUE