【发布时间】:2012-11-25 18:02:05
【问题描述】:
如何检查列表元素是否存在。这是一个列表列表,例如我想检查第三个元素 l1[[3]] 是否存在。我试过 is.null(l1[["3"]]) 但无论它是否存在,它都会返回false,如果我使用is.null(l1[[3]]),它会给出下标超出绑定的错误,以防它不存在但不是TRUE。 我该怎么办
【问题讨论】:
-
length(l1)>2怎么样?
如何检查列表元素是否存在。这是一个列表列表,例如我想检查第三个元素 l1[[3]] 是否存在。我试过 is.null(l1[["3"]]) 但无论它是否存在,它都会返回false,如果我使用is.null(l1[[3]]),它会给出下标超出绑定的错误,以防它不存在但不是TRUE。 我该怎么办
【问题讨论】:
length(l1)>2 怎么样?
tl;博士:
如果要检查元素 n 是否存在,即使检查列表末尾或空列表,请使用:
length(mylist) >= n # TRUE indicates exists. FALSE indicates DNE
对于嵌套列表,请务必检查正确的列表。例如:
length(outerlist[[innerlist]]) >= n
# SAMPLE DATA
mylist <- as.list(LETTERS[1:5])
[[1]]
[1] "A"
[[2]]
[1] "B"
[[3]]
[1] "C"
[[4]]
[1] "D"
[[5]]
[1] "E"
在元素 3 和 6 中测试 NULL。不是我们正在寻找的信息。
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
删除第三个元素。请注意,“空槽”未保留。 (即元素 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
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
myListWithNull <- list("A", "B", NULL, "D")
is.null(myListWithNull[[3]])
# TRUE
length(myListWithNull) >= 3
# TRUE
【讨论】:
length()。如果长度为>= 6,则第 6 个元素存在,否则不存在。在我的示例中,请注意在删除一个元素之前和之后检查第 5 个元素时的区别。
正如我发布的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 块捕获的越界条件。
【讨论】:
一旦条件为假,if 中的语句评估就会停止,您可以使用以下方法可靠地检查元素是否为空:
if(length(l1)<n || is.null(l1[[n]]){ # TRUE only if not NULL
}
您也可以使用命名列表
is.null(l1[["a"]])
的行为独立于列表的长度。
【讨论】: