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

Альтернатива "! is.null()" в R

мой R-код заканчивается тем, что содержит множество выражений формы:

if (!is.null(aVariable)) { 
     do whatever 
}

Но такого рода утверждение трудно прочитать, поскольку оно содержит два отрицания. Я бы предпочел что-то вроде:

 if (is.defined(aVariable)) { 
      do whatever 
 }

Существует ли функция типа is.defined, которая делает противоположное значение! is.null существует стандарт в R?

веселит, Янник

4b9b3361

Ответ 1

Возможно, вам лучше не использовать то, что значение вводит ваша функция или код, и просить об этом:

if (is.integer(aVariable))
{
  do whatever
}

Это может быть улучшение по сравнению с isnull, поскольку оно обеспечивает проверку типов. С другой стороны, это может снизить общую степень вашего кода.

В качестве альтернативы просто выполните нужную функцию:

is.defined = function(x)!is.null(x)

Ответ 2

Если это просто вопрос легкого чтения, вы всегда можете определить свою собственную функцию:

is.not.null <- function(x) !is.null(x)

Таким образом, вы можете использовать все это в своей программе.

is.not.null(3)
is.not.null(NULL)

Ответ 3

Ian поместил это в комментарий, но я думаю, что это хороший ответ:

if (exists("aVariable"))
{
  do whatever
}

обратите внимание, что имя переменной указано.

Ответ 4

Пакет 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

Я также видел:

if(length(obj)) {
  # do this if object has length
  # NULL has no length
}

Я не думаю, что это здорово, хотя. Потому что некоторые векторы могут иметь длину 0. character(0), logical(0), integer(0) и могут рассматриваться как NULL вместо ошибки.

Ответ 6

Для обработки неопределенных переменных, а также нулей, вы можете использовать substitute с помощью deparse:

nullSafe <- function(x) {
  if (!exists(deparse(substitute(x))) || is.null(x)) {
    return(NA)
  } else {
    return(x)
  }
}

nullSafe(my.nonexistent.var)