2017-09-02 6 views
1

Comment accéder aux éléments d'une liste nommée par son nom?rpy2 accès R liste les éléments de la liste par nom, interface de bas niveau

J'ai 3 fonctions, qui retournent toutes ListSexpVector de la classe htest. L'un d'eux a 5 éléments, ['method', 'parameter', 'statistic', 'p.value', 'data.name'], d'autres ont un nombre différent, et l'ordre. Je suis intéressé à extraire le p.value, statistic et parameter de cette liste. En R Je peux utiliser $, comme ceci:

p.value <- fit$p.value 
statistic <- fit$statistic 
param <- fit$parameter 

Le meilleur équivalent j'ai trouvé dans rpy2 va comme:

p_val = fit[list(fit.do_slot('names')).index('p.value')] 
stat = fit[list(fit.do_slot('names')).index('statistic')] 
param = fit[list(fit.do_slot('names')).index('parameter')] 

Ce qui est assez longue haleine. Y a-t-il un meilleur moyen (plus court, plus doux, pythonique)?


Il est le bon vieux jeu entier indexation basé:

p_val = fit[3] 
stat = fit[2] 
param = fit[1] 

Mais il ne fonctionne pas lorsque les positions sont changées, et est donc une sérieuse limitation parce que je suis différent de montage 3 fonctions, et chacun retourne un ordre différent.

Répondre

2

L'interface de haut niveau est destinée à fournir une interface plus conviviale car l'interface de bas niveau est assez proche de l'API C de R. Avec elle, on peut faire:

p_val = fit.rx2('p.value') 

ou

p_val = fit[fit.names.index('p.value')] 

Si vous travaillez avec l'interface de bas niveau, vous aurez essentiellement à mettre en œuvre votre propre emballage pratique pour reproduire ces fonctionnalités. Par exemple:

def dollar(obj, name): 
    """R's "$".""" 
    return obj[fit.do_slot('names').index(name)] 
+0

Oh, il y a un accesseur '.rx2'! Je ne savais pas à ce sujet. Je ne l'ai pas trouvé dans les docs. Je vous remercie! – Kartik

+0

Il est brièvement mentionné ici: http://rpy2.readthedocs.io/en/version_2.8.x/vector.html#extracting-r-style (bien que pour l'instant il n'y a pas d'exemple de code pour cela) – lgautier