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

rpy2 access R named list items by name, low-level interface

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

我有 3 个函数,所有函数都是 return class htestListSexpVector。其中一个有 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 个不同的函数,每个 return 一个不同的顺序。

高层接口是为了提供更友好的接口,因为底层接口非常接近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)]