2016-10-17 52 views
6

İç içe geçmiş bir listedeki birinci düzey öğelerin benzersiz sınıflarını almak için ileriye doğru bir yol arıyorum.İç içe geçmiş bir listede benzersiz sınıflar

tekrarlanabilir örnek:

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')) 

cevap

6

Bu çalışır

list_classes <- function(ls) { 
    unique(sapply(ls, class)) 
} 

lapply(x, list_classes) 

#[[1]] 
#[1] "numeric" "character" 

#[[2]] 
#[1] "numeric" 

#[[3]] 
#[1] "numeric" "list" 

Düzenleme: Yinelemeli versiyonu istenen çıkış Yine

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" 
+2

özdeş değildir. – 989

+0

Doğru, fark ettim, bazı listeleri açmamız gerekiyor – BonStats

+1

@BonStats Çevrenizdeki bir çalışma, tekrar tekrar işlevlendirmek olacaktır. – 989