36

假设您想基于条件构建一个简单的测试setdiff(input, 1:9)

我怎样才能构建一个

if isnotempty(setdiff(input, 1:9)) stop ("not valid") 

输入时停止执行c(3, 12)但输入时继续执行的语句c(2,5,7)?非常感谢,伯蒂

4

5 回答 5

51

你可以使用?length

isEmpty <- function(x) {
    return(length(x)==0)
}

input <- c(3, 12);

if (!isEmpty(setdiff(input, 1:9))) {
    stop ("not valid")
}
于 2012-05-19T11:41:03.687 回答
19

这是另一种选择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")
}
于 2012-05-19T13:01:10.857 回答
1

我使用了以下功能:

# 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)
}

希望它会有用。

于 2019-10-14T07:57:08.397 回答
0

这并不能回答您的主题行中的问题,但我认为这是您要实现的目标的更好方法:

 if(!all(input %in% 1:9)) stop("not valid")
于 2012-05-19T18:20:29.920 回答
0

我喜欢 isEmpty 函数。我提出以下建议,以防万一您解析向量或列表:

isEmpty <- function(x) {
s<-sapply(x, function(y) length(y)==0, simplify = T)
return(s)
}
于 2018-06-13T11:38:55.693 回答