rpy2访问R按名称,低级接口命名列表项

时间:2017-09-02 04:18:15

标签: rpy2

如何按名称访问命名列表的元素?

我有3个函数,所有函数都返回ListSexpVector个类htest。其中一个元素有5个元素['method', 'parameter', 'statistic', 'p.value', 'data.name'],其他元素有不同的数字和顺序。我有兴趣从此列表中提取p.valuestatisticparameter。在R中我可以使用$,如下所示:

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

我在rpy2中找到的最佳效果如下:

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

这很啰嗦。是否有更好的(更短,更甜,Pythonic)方式?

基于良好的老式整数索引:

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

但是当位置发生变化时它不起作用,因此是一个严重的限制,因为我拟合了3个不同的函数,每个函数返回不同的顺序。

1 个答案:

答案 0 :(得分:2)

高级接口旨在提供更友好的接口,因为低级接口非常接近R的C-API。有了它可以做:

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

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

如果使用低级接口,您将必须实现自己的便利包装器来重现这些功能。例如:

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