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]]
(这清楚地表明您正在分配而不是例如打印)。