Ответ 1
Вы можете использовать ?length
:
isEmpty <- function(x) {
return(length(x)==0)
}
input <- c(3, 12);
if (!isEmpty(setdiff(input, 1:9))) {
stop ("not valid")
}
Предположим, вы хотели бы построить простой тест, основанный на условии setdiff(input, 1:9)
.
Как я могу построить
if isnotempty(setdiff(input, 1:9)) stop ("not valid")
который останавливает выполнение при вводе c(3, 12)
, но продолжает, когда ввод c(2,5,7)
говорит?
Большое спасибо,
Берти
Вы можете использовать ?length
:
isEmpty <- function(x) {
return(length(x)==0)
}
input <- c(3, 12);
if (!isEmpty(setdiff(input, 1:9))) {
stop ("not valid")
}
Вот еще один вариант identical(x, numeric(0))
. Вот пример (в основном взял все от sgibb и заменил ключевую строку, поскольку я ленив):
isEmpty <- function(x) {
return(identical(x, numeric(0)))
}
input <- c(3, 12)
if (!isEmpty(setdiff(input, 1:9))) {
stop ("not valid")
}
Это не отвечает на вопрос в вашей теме, но я думаю, что это лучший подход к тому, чего вы пытаетесь достичь:
if(!all(input %in% 1:9)) stop("not valid")
Мне понравилась функция isEmpty. Я предлагаю следующее, на случай, если вы проанализируете вектор или список:
isEmpty <- function(x) {
s<-sapply(x, function(y) length(y)==0, simplify = T)
return(s)
}
Я использовал следующие функции:
# 1. Check if 'integer(0)'
is.integer0 <- function(x) {
is.integer(x) && length(x) == 0L
}
# 2. Check if 'numeric(0)'
is.numeric0 <- function(x) {
identical(x, numeric(0))
}
# 3. Check is 'integer0' or 'numeric0'
is.int_num_0 <- function(x) {
is.integer0(x) || is.numeric0(x)
}
Надеюсь, это будет полезно.