I am looking for a straight forward way to get the unique classes of the first-level elements in a nested list.
Reproducible example:
x = list(list(1,"A"), # Unique classes:  character, numeric
         4, # Unique classes: numeric
         list(1,2,list(4,5, list(6)))) # Unique classes: numeric
# Expected return: list(c('character', 'numeric'), c('numeric'), c('numeric'))
                This works
list_classes <- function(ls) {
  unique(sapply(ls, class))
}
lapply(x, list_classes)
#[[1]]
#[1] "numeric"   "character"
#[[2]]
#[1] "numeric"
#[[3]]
#[1] "numeric" "list"
Edit: Recursive version
list_classes <- function(ls) {
  # get classes of list
  cls <- sapply(ls, class)
  # which are lists themselves
  which_ls <- cls == "list"
  lists <- ls[which_ls]
  # which are non lists
  non_lists <- cls[!which_ls]
  # recursively evaluate contents of list for their classes
  return(
    unique(
      c(non_lists, sapply(lists, list_classes), recursive = T)
    )
  )
}
lapply(x, list_classes)
#[[1]]
#[1] "numeric"   "character"
#[[2]]
#[1] "numeric"
#[[3]]
#[1] "numeric"
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With