Как проверить, существует ли элемент в векторе, когда элемент может иметь значение NULL, используя базовые функции r - PullRequest
0 голосов
/ 07 сентября 2018

Предположим, у нас есть вектор и мы хотим проверить, является ли переменная частью этого вектора. Это будет использоваться в функции для обработки ошибок, и вход также может быть NULL

values <- c("ALL", "NON")
parameter <- "ALL"

простое решение - использовать is.element () или% в%, но параметр может быть НЕДЕЙСТВИТЕЛЕН, и в этом случае мы получим ошибку в if ()

parameter <- NULL

is.element(parameter, values)
logical(0)

if(is.element(parameter, values)){stop("invalid parameter")}

Error in if (is.element(parameter, values)) { : 
  argument is of length zero

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Есть несколько способов проверить. Точная функция для проверки - is.null, которая возвращает TRUE, если это NULL

!is.null(parameter) && is.element(parameter, values)

Другой вариант - length, который возвращает 0 для NULL

length(parameter) > 0 && is.element(parameter, values)

ПРИМЕЧАНИЕ. Оба метода оценивают второй аргумент, только если первое условие имеет значение ИСТИНА. Поэтому он будет возвращать FALSE всякий раз, когда «параметр» равен NULL. Мы можем оценить это в том же порядке аргументов, что и в операторе is.element с

1:3 %in% 2
#[1] FALSE  TRUE FALSE
2 %in% 1:3
#[1] TRUE

возвращает разные результаты.

ПРИМЕЧАНИЕ: пакеты не используются, и здесь мы предполагаем, что векторы прохождения OP того же типа

0 голосов
/ 07 сентября 2018

Если вы хотите использовать %in%, вы можете отменить вызов и использовать any сверху:

any(c("ALL", "NON") %in% NULL) # [1] FALSE

c("ALL", "NON") %in% NULL возвращает логическую длину 2, поэтому нам нужно any, чтобы получить вывод.

Другая возможность заключается в использовании purrr::has_element, который обрабатывает этот случай:

library(purrr)
has_element(c("ALL", "NON"), NULL) # [1] FALSE

Это также строже:

has_element(1, "1") # [1] FALSE
is.elements(1, "1") # [1] TRUE
has_element(list(iris), list(as.list(iris)))  # [1] FALSE
is.element(list(iris), list(as.list(iris))) # [1] TRUE
...