0

我对 R plotKML 包有一个奇怪的问题,我可以在其中使用该kml_layer()函数,直到我尝试将其合并kml_layer到我自己的函数中并将参数从我的自定义函数传递给kml_layer函数。到目前为止,我只使用 kml_layer.Raster() 方法遇到了这个问题。产生的错误是:Error in eval(call.lst[["z.lim"]]) : object 'rangeArg' not found'rangeArg' 是下面示例中我自己的对象。

我认为这是一个一般环境/范围问题,但我以前从未遇到过它,我无法在其他任何地方重现它。这是一个可重现的例子。

library(raster)
library(plotKML)
# load a small raster dataset referenced by raster package:
elevation <- getData('alt', country='CHE') 
ElevationRange <- c(2000,3000)

#Works:----------------
plotKML::kml_open("test",overwrite=TRUE)
plotKML::kml_layer(obj = elevation,
                   colour=CHE_msk_alt,
                   z.lim=c(2000,3000))  #Testing  z.lim argument without named object
plotKML::kml_close(file.name="test.kml")

#Works:-------------------------
plotKML::kml_open("test",overwrite=TRUE)
plotKML::kml_layer(obj = elevation,
                   colour=CHE_msk_alt,
                   z.lim=ElevationRange) #Testing z.lim with an object being passed
plotKML::kml_close(file.name="test.kml")

#Doesn't Work:-----------------------
writeSimpleRasterKML <- function(rangeArg = ElevationRange){
  plotKML::kml_open("test",overwrite=TRUE)
  plotKML::kml_layer(obj = elevation,
                     colour=CHE_msk_alt,
                     z.lim=rangeArg)  #Wrapping code in function and passing a function argument to z.lim
  plotKML::kml_close(file.name="test.kml")
}

writeSimpleRasterKML()  #ERROR HERE

看:

> writeSimpleRasterKML()
KML file opened for writing...
Error in eval(call.lst[["z.lim"]]) : object 'rangeArg' not found
Called from: eval(call.lst[["z.lim"]])
4

1 回答 1

0

我发布了这个问题,因为它是常用 R 包中的一个错误,其他人在谷歌错误消息时可能会遇到。这是我使用的修复程序。我希望有人能解释错误的根源,以便以一种不那么笨拙的方式修复它。但是现在,根据您在自定义函数中所需的范围重新分类您的栅格应该可以解决问题。见下文:

writeSimpleRasterKMLFixed <- function(rasterArg = elevation, rangeArg = ElevationRange){

  tempRaster <- rasterArg
  tempRaster[tempRaster < rangeArg[1]] <- rangeArg[1]
  tempRaster[tempRaster > rangeArg[2]] <- rangeArg[2]

  plotKML::kml_open("test",overwrite=TRUE)
  plotKML::kml_layer(obj = tempRaster,colour=CHE_msk_alt)
  plotKML::kml_close(file.name="test.kml")
}

writeSimpleRasterKMLFixed()

有用:

> writeSimpleRasterKMLFixed()
KML file opened for writing...
Writing to KML...
Closing  test.kml
于 2021-01-12T02:32:37.837 回答