Альтернатива "! is.null()" в R
мой R-код заканчивается тем, что содержит множество выражений формы:
if (!is.null(aVariable)) {
do whatever
}
Но такого рода утверждение трудно прочитать, поскольку оно содержит два отрицания. Я бы предпочел что-то вроде:
if (is.defined(aVariable)) {
do whatever
}
Существует ли функция типа is.defined
, которая делает противоположное значение! is.null существует стандарт в R?
веселит,
Янник
Ответы
Ответ 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)