Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
网格上的Arcpy映射代数_R_Arcpy_Reticulate - Fatal编程技术网

网格上的Arcpy映射代数

网格上的Arcpy映射代数,r,arcpy,reticulate,R,Arcpy,Reticulate,我试图通过网状结构使用R中的arcpy。在大多数情况下,它工作得非常好。然而,我在尝试做光栅代数时遇到了一些问题。考虑下面的代码: library(reticulate) use_python("C:/Python27/ArcGISx6410.2") arcpy = import("arcpy") arcpy$CheckOutExtension("Spatial") arcpy$management$CreateRandomRaster("in_memory", "randrast",

我试图通过网状结构使用R中的arcpy。在大多数情况下,它工作得非常好。然而,我在尝试做光栅代数时遇到了一些问题。考虑下面的代码:

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中出错:二进制运算符的非数值参数

看起来,即使Netracte认识到光栅是Python对象Python.builtin.Raster Python.builtin.object,它也不知道使用Python的+运算符而不是R运算符。我尝试使用convert=FALSE导入arcpy,但错误相同

我可以通过定义Python函数来模拟基本的算术运算符来解决这个问题

tmp = tempfile(fileext = ".py")
cat("def add(x, y):\n  return x + y\n", file = tmp)

source_python(tmp)

doublerast = add(randrast, randrast)
但显然,对于更复杂的语句,这会变得相当麻烦


有人知道有什么方法可以强制Networkate对Python对象使用Python的算术运算符而不是R吗?

一个选项是使用运算符模块为Python对象定义我自己的运算符:

或者,使用S3类重载算术运算符,就像支持python.builtin.object一样,例如

但我担心操作顺序可能不会像预期的那样发挥作用

`%py+%` = function(e1, e2) {
  op = import("operator")
  op$add(e1, e2)
}

doublerast = randrast %py+% randrast 
`+.python.builtin.object` = function(e1, e2) {
  op = import("operator")
  op$add(e1, e2)
}