rpy2 доступ R именованных элементов списка по имени, низкоуровневый интерфейс
Как получить доступ к элементам именованного списка по имени?
У меня есть 3 функции, все из которых возвращают ListSexpVector
класса htest
, Один из них имеет 5 элементов, ['method', 'parameter', 'statistic', 'p.value', 'data.name']
другие имеют другой номер и порядок. Я заинтересован в извлечении p.value
, statistic
а также parameter
из этого списка. В РИ можно использовать $
, вот так:
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')]
Что довольно многословно. Есть ли лучший (короче, слаще, питон) способ?
Существует старомодная целочисленная индексация:
p_val = fit[3]
stat = fit[2]
param = fit[1]
Но это не работает, когда меняются позиции, и, следовательно, является серьезным ограничением, потому что я устанавливаю 3 разные функции, и каждая возвращает свой порядок.
1 ответ
Интерфейс высокого уровня предназначен для обеспечения более дружественного интерфейса, так как интерфейс низкого уровня довольно близок к C-API R. С этим можно сделать:
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)]