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)]
Другие вопросы по тегам