rpy2 按名称访问 R 命名列表项,低级接口
rpy2 access R named list items by name, low-level interface
如何按名称访问命名列表的元素?
我有 3 个函数,所有函数都是 return class htest
的 ListSexpVector
。其中一个有 5 个元素,['method', 'parameter', 'statistic', 'p.value', 'data.name']
,其他的有不同的数量和顺序。我有兴趣从此列表中提取 p.value
、statistic
和 parameter
。在 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)]
如何按名称访问命名列表的元素?
我有 3 个函数,所有函数都是 return class htest
的 ListSexpVector
。其中一个有 5 个元素,['method', 'parameter', 'statistic', 'p.value', 'data.name']
,其他的有不同的数量和顺序。我有兴趣从此列表中提取 p.value
、statistic
和 parameter
。在 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)]