繁体   English   中英

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

[英]How to check the existence of elements of list in r

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

tl; dr:如果要检查元素n存在,即使在列表末尾或空列表中进行检查,也请使用:

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

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

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




R中的列表中的NULL与其他语言中的NULL有所不同。 例如,如果我们将列表的元素替换为NULL,则所有后续元素都将移入,并且列表的长度缩短一倍。

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

在元素3和6中测试NULL。不是我们所需要的信息。

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

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

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

删除第三个元素。 请注意, 没有保留“空插槽”。 (即元素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 

正如我在此处发布的那样,可以检查元素本身的长度以检查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块捕获到超出范围的条件。

由于条件一成立就立即停止if语句的评估,因此可以使用以下命令可靠地检查元素是否为空:

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

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

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

行为与列表的长度无关。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM