2017-04-19 1 views
1

Supposons que j'ai une liste commeTrouver la première place dans la liste imbriquée où certains membres n'existe pas

li <- list( 
     mammals = list( 
      giraffe = list(
      name  = 'giraffe', 
      occupation = 'giraffing'), 
      bear = list(
      name  = 'bear') 
     ), 
     amphibians = list(
      frog = list(
      name  = 'frog', 
      occupation = 'frogging'), 
      snake = list(
      name  = 'snake') 
     ) 
     ) 

Notez que bear et snake n'ont pas un élément occupation. Je veux parcourir ma liste sur ce niveau d'imbrication (profondeur 2) et retourner le premier (ou tout) membre qui n'a pas de membre occupation. Donc dans ce cas, les valeurs de retour appropriées pour ma fonction serait

li$mammals$bear 

ou

li$amphibians$snake 

Pour résumer, ma question est comment puis-je traverser sur un niveau de profondeur imbriqué et le retour d'un élément à base à une condition dans une liste comme ça?


Je ne suis pas du tout versé dans R, mais je crois que je compris comment déterminer si chaque élément de la liste à ma profondeur d'intérêt (2) a les membres que je veux assurer existent récursive avec quelque chose comme

required <- c('name', 'occupation') 

has_elems <- function(ob, 
         cur_d=0) 
    ifelse(is.list(ob), 
      all(sapply(ob, has_elems, cur_d=cur_d+1)), 
      cur_d != 2 || all(required %in% names(ob))) 

Je vais avoir du mal à comprendre comment plus facilement effectuer le traversal si mon intention est de ne pas simplement retourner TRUE ou FALSE mais la première condition fausse, comme indiqué ci-dessus, cependant. Notez qu'il s'agit d'un exemple de jouet - j'essaie en fait de valider certaines données d'entrée de l'utilisateur avant la saisie dans la base de données, ce qui est assez représentatif de mon problème.

+0

S'il vous plaît vérifier votre exemple d'entrée. C'est donner des erreurs – akrun

+0

@akrun Mes excuses, j'avais une virgule supplémentaire là-dedans. Devrait être bon maintenant je pense. –

+0

Essayez 'lapply (li, fonction (x) Filtre (longueur, spply (x, fonction (nm) nm [!" Occupation "% en% noms (nm)])) [1]' – akrun

Répondre

1

Nous pouvons boucle à travers le list imbriquée avec lapply, sous-ensemble des éléments en fonction de l'état logique %in%, Filter les éléments NULL de list

Filter(length, lapply(li, function(x) Filter(length, 
     lapply(x, function(nm) nm[!"occupation" %in% names(nm)]))))