Пакет 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)) {
...
}