Конвертировать NULL из Python в R, используя rpy2 - PullRequest
2 голосов
/ 11 апреля 2019

В R часто значение NULL используется по умолчанию.Используя Python и RPy2, как можно явно указать аргумент NULL?

None не является конвертируемым (NotImplementedError), строка «NULL» будет просто преобразована в строку и приведет кошибка во время выполнения.

Возьмите следующий пример с использованием пакета tsintermittent:

import numpy as np
from rpy2.robjects.packages import importr
from rpy2.robjects import numpy2ri

numpy2ri.activate()

tsintermittent = importr('tsintermittent')
crost = tsintermittent.crost

ts = np.random.randint(0,2,50) * np.random.randint(1,10,50)

# implicit ok, default w is NULL
# crost(ts)

# explicit - how to do it?
# RRunTimeError - non numeric argument
crost(ts, w='NULL')
# NotImplementedError
crost(ts, w=None)

Ответы [ 2 ]

2 голосов
/ 11 апреля 2019

Вы можете использовать объект r для импорта as.null, а затем вызвать эту функцию. Например:

from rpy2.robjects import r

as_null = r['as.null']
is_null = r['is.null']
print(is_null(as_null())) #prints TRUE

Я не пробовал ваш код из-за всех его зависимостей, но если as_null определен, как указано выше, вы сможете использовать

crost(ts, w=as_null())

В качестве альтернативы , используйте определение объекта NULL непосредственно из robjects:

import rpy2.robjects as robj

print(is_null(robj.NULL)) #prints TRUE
0 голосов
/ 11 апреля 2019

Возможно, проблема связана с кавычками в NULL.Не удалось проверить с помощью rpy2 (из-за проблем с установкой).Ниже приведен код, который работает с pyper

from pyper import *
import numpy as np
r=R(use_pandas=True)
ts = np.random.randint(0,2,50) * np.random.randint(1,10,50)
r('library(tsintermittent)')
r.assign('ts1', ts)
r('out <- crost(ts1, w = NULL)')
out1 = r.get('out')
out1.keys()
#['frc.out', 'initial', 'weights', 'components', 'model', 'frc.in']

Не удается проверить проблему с rpy2.Может быть, обратная кавычка будет возможность прочитать его, как это

crost(ts, w = `NULL`)
...