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.
S'il vous plaît vérifier votre exemple d'entrée. C'est donner des erreurs – akrun
@akrun Mes excuses, j'avais une virgule supplémentaire là-dedans. Devrait être bon maintenant je pense. –
Essayez 'lapply (li, fonction (x) Filtre (longueur, spply (x, fonction (nm) nm [!" Occupation "% en% noms (nm)])) [1]' – akrun