0

查看这个问题,可以测试列表的元素是否存在,前提是您的列表具有names

foo <- list(a=1)
"a" %in% names(list)  # TRUE
"b" %in% names(list)  # FALSE

但是,尚不清楚是否或如何将其扩展到未命名的列表:

foo <- list(1)
names(list)    # NULL

我可以使用它来测试它,tryCatch但它不是特别优雅:

indexExists <- function(list, index) {
  tryCatch({
    list[[index]]  # Efficiency if element does exist and is large??
    TRUE
  }, error = function(e) {
    FALSE
  })
}

有没有更好的方法来解决这个问题?

4

1 回答 1

0

Hong Ooi 的答案适用于一维,但我想我会添加一个适用于多维索引的答案。

indexExists <- function(ind, form) {
    if (ind[[1]] > length(form) || ind[[1]] < 1)
        return(FALSE)
    dim <- 1
    while (dim + 1 <= length(ind)) {
        if (ind[dim + 1] > length(form[[ ind[1:dim] ]] ) || ind[dim + 1] < 1)
            return(FALSE)
        dim <- dim + 1
    }
    return(TRUE)
}

这是一些示例输出:

> aList <- list( list(1,2,list(1,10,100,1000),3), 5 )
> indexExists(c(1), aList)
[1] TRUE
> indexExists(c(2), aList)
[1] TRUE
> indexExists(c(0), aList)
[1] FALSE
> indexExists(c(3), aList)
[1] FALSE
> indexExists(c(1,1), aList)
[1] TRUE
> indexExists(c(1,3), aList)
[1] TRUE
> indexExists(c(1,4), aList)
[1] TRUE
> indexExists(c(1,0), aList)
[1] FALSE
> indexExists(c(1,5), aList)
[1] FALSE
> indexExists(c(1,3,4), aList)
[1] TRUE
> indexExists(c(1,3,5), aList)
[1] FALSE

请注意,我认为您问题中答案的效率并不取决于列表元素的大小,因为在这种情况下,如果您修改复制的对象,R 只会在内存中创建一个新对象。我可能会建议分配list[[index]](这清楚地表明您正在分配而不是例如打印)。

于 2014-05-04T02:29:56.687 回答