альтернатива "! is.null ()" в R - PullRequest
51 голосов
/ 01 февраля 2010

Мой код R в конечном итоге содержит множество утверждений вида:

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

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

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

Является ли функция типа is.defined, противоположная! Is.null, стандартной в R?

ура, Янник

Ответы [ 6 ]

33 голосов
/ 01 февраля 2010

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

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

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

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

is.defined = function(x)!is.null(x)
15 голосов
/ 02 февраля 2010

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

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

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

is.not.null(3)
is.not.null(NULL)
8 голосов
/ 01 февраля 2010

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

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

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

2 голосов
/ 06 июля 2018

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

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

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

2 голосов
/ 13 июля 2017

Пакет 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)) {
  ...
}
0 голосов
/ 29 декабря 2018

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

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

nullSafe(my.nonexistent.var)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...