rpy2访问R按名称命名的列表项,低级接口
问题描述:
如何按名称访问指定列表的元素?rpy2访问R按名称命名的列表项,低级接口
我有3个函数,所有这些函数都返回类的ListSexpVector
。其中一个有5个元素,['method', 'parameter', 'statistic', 'p.value', 'data.name']
,其他人有不同的数字和顺序。我有兴趣从这个列表中提取p.value
,statistic
和parameter
。在R I可以使用$
,像这样:
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个不同的功能,并且每个返回不同的顺序。
答
高级接口旨在提供更友好的接口,因为低级接口非常接近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)]
噢,有一个'.rx2'访问器!我不知道这件事。没有在文档中找到它。谢谢! – Kartik
这里简单地提到:http://rpy2.readthedocs.io/en/version_2.8.x/vector.html#extracting-r-style(尽管目前没有代码示例) – lgautier