是否有一种“内置”/有效且强大的方法来检查列表对象是否嵌套?
为了澄清我对嵌套一词的理解:
扁平或非嵌套列表
x.1 <- list(
a=TRUE,
b=1:5
)
嵌套列表
x.2 <- list(
a=list(a.1=list(a.1.1=TRUE)),
b=list(b.1=1:5)
)
我的第一个想法是使用str
,capture.output
和正则表达式的组合。但是作为与正则表达式相关的所有内容:非常强大,在健壮性方面非常冒险;-) 所以我想知道那里是否有更好的东西:
isNested <- function(x) {
if (class(x) != "list") {
stop("Expecting 'x' to be a list")
}
out <- FALSE
strout <- capture.output(str(x))
idx <- grep("\\$.*List", strout)
if (length(idx)) {
out <- TRUE
}
return(out)
}
> isNested(x=x.1)
[1] FALSE
> isNested(x=x.2)
[1] TRUE
第二种方法由 Roman 和 Arun 提供:
isNested2 <- function(x) {
if (class(x) != "list") {
stop("Expecting 'x' to be a list")
}
out <- any(sapply(x, is.list))
return(out)
}
> isNested2(x=x.1)
[1] FALSE
> isNested2(x=x.2)
[1] TRUE