Ошибка ключевого слова: вызов функции as.geodata в geoR с помощью rpy2

Я получаю SyntaxError: keyword can't be an expression в сценарии, над которым я работаю.

я использую rpy2 (и пакет R geoR) в Python для работы с таблицей данных, которая извлекается из базы данных PostgreSQL с использованием функций базы данных R. Данные представляют собой пространственные данные с координатами и 2 столбцами числовых данных, которые будут использоваться в геостатистической модели.

После вызова запроса к базе данных объект dataframe x выглядит следующим образом:

    easting northing location attrib1 attrib2    category
1  658394.3 204987.5       p1         4.91        26.17 soil
2  658657.1 205116.7       p2         4.85        27.43 soil
...

Я создаю объект для функций geoR следующим образом:

из rpy2.robjects.packages import importr geo = importr('geoR')

Вызов функции geoR как

y=geo.as_geodata(x)  

работает, НО без аргумента data.col, он назначает атрибут location в качестве атрибута data. (Первый столбец после атрибутов координат по умолчанию.)

Попытка:

y=geo.as_geodata(x,geo.data_col="4:5")

производит:

SyntaxError: keyword can't be an expression

Я не могу обойти это. Я просмотрел несколько постов здесь и просмотрел онлайн, но не могу понять это.

2 ответа

Rpy2 - это мост к Python, отображающий типы Python на R типов, когда это необходимо. Здесь вы передаете параметр со значением "4:5", то есть Python str, Этот параметр становится R character (вектор строк в R-языке).

Когда вы пишете вызов функции R, такой как foo(bar = 4:5) то, что вы пишете, является R-кодом в качестве значения параметраbar, этот код будет оценен, чтобы дать фактический параметр.

Я думаю, что вы хотите это:

from rpy2.robjects.vectors import IntVector
y=geo.as_geodata(x, data_col = IntVector((4,5)))

или же

base = importr('base')
y=geo.as_geodata(x, data_col = base.c(4,5))

Я думаю, что ошибка связана с тем, что вы пытаетесь передать два столбца data_col команда. Вот рабочий пример использования meuse набор данных из gstat пакет.

import rpy2.robjects as robjects
from rpy2.robjects.packages import importr 
geo = importr('geoR')
gstat= importr("gstat")
robjects.r("data(meuse)")
x = robjects.r("meuse")
y = geo.as_geodata(x,data_col=5,coords_col="1:2")
vario = geo.variog(y)
robjects.r.plot(vario)

Однако вы заметите, что вышеупомянутое не работает, потому что geoR не похоже на coords.col или data.col аргументы. Я не уверен, почему это так, но решение этой проблемы - написать функцию обтекания.

robjects.r('''
geodata_python <- function(obj) {
        return(as.geodata(obj, data.col=5, coords.col=1:2))
}
''')
geodata_wrapper =  robjects.globalenv['geodata_python']
y = geodata_wrapper(x)
vario = geo.variog(y)
robjects.r.plot(vario)

Используя вышеуказанный метод, вы можете передать дополнительные аргументы as.geodata функция в пределах geodata_python функция в пределах R среда.

НТН

Другие вопросы по тегам