Ошибка ключевого слова: вызов функции 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
среда.
НТН