如何检查r中列表元素的存在

时间:2012-12-07 14:32:15

标签: r matrix

如何检查列表元素是否存在。这是一个列表列表,例如我想检查第三个元素l1 [[3]]是否存在。我试过is.null(l1 [[“3”]]) 但无论是否存在,它都返回false,如果我使用is.null(l1 [[3]]),它将在不存在但不为TRUE的情况下给出下标的错误。 我该怎么办

3 个答案:

答案 0 :(得分:4)

<强> TL; DR: 如果要检查元素n是否存在,即使检查列表末尾还是空列表,请使用:

length(mylist) >= n   # TRUE indicates exists. FALSE indicates DNE

对于嵌套列表,请务必检查正确的列表。例如:

 length(outerlist[[innerlist]]) >= n




R中列表中的NULL与其他语言中的列表有所不同。例如,如果我们用NULL替换列表的元素,则所有后续元素都会被移位,并且列表的长度会减少一个。

# SAMPLE DATA
mylist <- as.list(LETTERS[1:5])

    [[1]]
    [1] "A"

    [[2]]
    [1] "B"

    [[3]]
    [1] "C"

    [[4]]
    [1] "D"

    [[5]]
    [1] "E"

在元素3&amp;中测试NULL 6.不完全是我们正在寻找的信息。

is.null(mylist[[3]])
# FALSE

is.null(mylist[[6]])
# Error in mylist[[6]] : subscript out of bounds

相反,我们检查列表的长度:

length(mylist) >= 3  # TRUE
length(mylist) >= 5  # TRUE
length(mylist) >= 6  # FALSE

删除第3个元素。请注意,“空插槽”保留。 (即元素4,变为元素3等。)

mylist[[3]] <- NULL

  [[1]]
  [1] "A"

  [[2]]
  [1] "B"

  [[3]]
  [1] "D"

  [[4]]
  [1] "E"


length(mylist) >= 3  # TRUE
length(mylist) >= 5  # FALSE
length(mylist) >= 6  # FALSE

空列表的长度为0

emptyList <- list()
length(emptyList)  # 0

nestedList <- list( letters=list("A", "B", "C"), empty=list(), words=list("Hello", "World"))

length(nestedList)
  # [1] 3
lapply(nestedList, length)
  # $letters
  # [1] 3
  #
  # $empty
  # [1] 0
  #
  # $words
  # [1] 2


<小时/> 请注意,您可以将NULL包含在列表中。当测试NULL适用时。例如:

myListWithNull <- list("A", "B", NULL, "D")

is.null(myListWithNull[[3]])
  # TRUE

length(myListWithNull) >= 3
  # TRUE

答案 1 :(得分:0)

当我发布here时,不是检查整个列表的长度,而是可以检查元素本身的长度以检查NULL值。据我所知,除NULL以外的所有值的长度都大于0。

x <- list(4, -1, NULL, NA, Inf, -Inf, NaN, T, x = 0, y = "", z = c(1,2,3))
lapply(x, function(el) print(length(el)))
[1] 1
[1] 1
[1] 0
[1] 1
[1] 1
[1] 1
[1] 1
[1] 1
[1] 1
[1] 1
[1] 3

因此,我们可以创建一个适用于命名和编号索引的简单函数:

element.exists <- function(var, element)
{
  tryCatch({
    if(length(var[[element]]) > -1)
      return(T)
  }, error = function(e) {
    return(F)
  })
}

如果该元素不存在,则会导致tryCatch块捕获的越界条件。

答案 2 :(得分:0)

当条件为false时,如果评估语句是否停止,则可以使用以下内容可靠地检查元素是否为空:

if(length(l1)<n || is.null(l1[[n]]){ # TRUE only if not NULL
}

或者,您可以使用命名列表

is.null(l1[["a"]])

的行为独立于列表的长度。