Есть ли «встроенный»/эффективный и надежный способ проверки, являются ли объекты списка вложенными или нет?Проверьте, является ли список вложенным или нет
Чтобы прояснить мое понимание термина вложенной:
Flat или нет вложенного список
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
Второй подход любезно римской и Аруна:
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
Что делать, если вы проверили свой первый список заказов, если список классов? Если да, то он вложен, иначе нет. Что-то в строках 'any (sapply (x.2, function (x) class (x) ==" list "))'. 'any (sapply (x.1, function (x) class (x) ==" list "))' возвращает FALSE. –
'any (sapply (my_list, class) ==" list ")' – Arun
Правильно, это было бы проще ;-) Спасибо, ребята! Внедрение вашего подхода в качестве второго подхода. Cheers – Rappster