Введите Rlist в Python, используя rpy2 - PullRequest
0 голосов
/ 17 июня 2020

Я управляю R через Python пакетом rpy2. Все работает нормально, за исключением случаев, когда мне нужно ввести некоторые аргументы функции через Rlist . Списки определяются тем же ключевым словом, что и Python: list; но по содержанию он совсем другой. Поскольку Python считает, что я создаю список Python вместо Rlist, всегда отображается ошибка. Я использую rpy2 для управления пакетом WaveleComp R.

Здесь я показываю пример, в котором я пытаюсь запрограммировать legend_params:

import pandas as pd
# Import R manage tools:
import rpy2.robjects.packages as rpackages
from rpy2.robjects.vectors import StrVector, Matrix
from rpy2.robjects.packages import importr
import rpy2.robjects as ro
R = ro.r
from rpy2.robjects import pandas2ri
pandas2ri.activate()
grdevices = importr('grDevices')    

data = pd.read_excel('Data.xlsx')      # Load data
wvt = importr('WaveletComp')           # Import WaveletComp R package
# Continuous Wavelet Transform of the data:
cwt = wvt.analyze_wavelet(data ,'Valores',loess_span = 0.75, dt=1,dj=1/20,
    lowerPeriod = 2, upperPeriod = 30, make_pval = True, n_sim = 100)


# Create image saver
grdevices.png(filename="Subsidencia_Wavelets.png", width = 14, height = 6,
              units = 'in', res = 1000, pointsize = 12)
# Save image (here is where error is generated)
wvt.wt_image(cwt, color_key = "quantile", main = (trayectoria + ' - ' + agregado),
    n_levels = 250, show_date = True, periodlab = "period (months)",
    legend_params = list(lab = "wavelet power levels", mar = 4.7))


# Close Graphical Device  
grdevices.graphics_off()

Out[]:

  File "C:/Users/Dell/wavelet.py", line 88, in <module>
    legend_params = list(lab = "wavelet power levels", mar = 4.7))

TypeError: list() takes no keyword arguments

Я попытался создать Rlist через rinterface , но создается объект, не являющийся типом, что также показывает ошибку.

Продолжите предыдущий пример:

import rpy2.rinterface as ri
ri.initr()

lista = ri.initr('ListVector(lab = "wavelet power levels", mar = 4.7)')
wvt.wt_image(cwt, color_key = "quantile", main = (trayectoria + ' - ' + agregado),
    n_levels = 250, show_date = True, periodlab = "period (months)",
    legend_params = lista)


  File "C:\WPy64-3760\python-3.7.6.amd64\lib\site-packages\rpy2\robjects\conversion.py", line 60, in _py2ri
    raise NotImplementedError("Conversion 'py2ri' not defined for objects of type '%s'" % str(type(obj)))

NotImplementedError: Conversion 'py2ri' not defined for objects of type '<class 'NoneType'>'

Я был бы очень рад тому, кто мог бы мне помочь. Большое спасибо.

1 Ответ

0 голосов
/ 21 июня 2020

rpy2.rinterface.initr используется для инициализации встроенного R, и вам не нужно беспокоиться об этом, если вы используете интерфейс rpy2.robjects.

ListVector - это класс rpy2, видимый только из Python сторона: https://rpy2.github.io/doc/v3.3.x/html/vector.html#rpy2 .robjects.vectors.ListVector

Конструктор для ListVector работает следующим образом:

lista = rpy2.robjects.ListVector({'lab': "wavelet power levels", 'mar': 4.7})
...