我正试图通过arcpy
从R中使用reticulate
。在大多数情况下,它的效果非常好。但是,在尝试进行栅格代数时,我遇到了一些问题。请考虑以下代码:
library(reticulate)
use_python("C:/Python27/ArcGISx6410.2")
arcpy = import("arcpy")
arcpy$CheckOutExtension("Spatial")
arcpy$management$CreateRandomRaster("in_memory",
"randrast", "NORMAL 3.0", "0 0 500 500", 50)
randrast = arcpy$sa$Raster("in_memory/randrast")
doublerast = randrast + randrast
randrast + randrast中的错误:二元运算符的非数字参数
似乎即使reticulate
认识到栅格是Python对象("python.builtin.Raster" "python.builtin.object"
),它也不知道使用Python的+
运算符而不是R'。我尝试使用arcpy
导入convert = FALSE
,但错误是相同的。
我可以通过定义Python函数来模拟基本的算术运算符来解决这个问题。
tmp = tempfile(fileext = ".py")
cat("def add(x, y):\n return x + y\n", file = tmp)
source_python(tmp)
doublerast = add(randrast, randrast)
但显然这对于更复杂的陈述来说非常麻烦。
有没有人知道如何强制reticulate
使用Python的算术运算符来代替R对象?
答案 0 :(得分:1)
一种选择是使用operator
模块为Python对象定义自己的运算符:
`%py+%` = function(e1, e2) {
op = import("operator")
op$add(e1, e2)
}
doublerast = randrast %py+% randrast
或者,或者,使用S3类重载算术运算符(如TensorFlow所做的那样)以支持python.builtin.object
,例如
`+.python.builtin.object` = function(e1, e2) {
op = import("operator")
op$add(e1, e2)
}
但我担心操作顺序可能无法按预期运行。