1

在我第一次涉足 foreach 时,我收到了这个错误:

   Error in function (handle)  :
  no function to return from, jumping to top level

我为每个工人得到一个。

我正在使用 doMC/多核后端。

起初我认为这是由于我的 foreach 调用中的函数试图将其作为副作用发送到控制台的文本进度条引起的,但在关闭它后我仍然收到错误消息。尽管出现错误,评估仍在继续,所有仓鼠似乎都在运行。里面的函数恰好是library(raster) 中的 reclass() calc()。谁能猜出这可能意味着什么?我想我会在等待查看输出是否有效时询问。


更新

这是代码的核心:

    foreach( cover= names( classes), .packages= "raster") %dopar% {
      class <- classes[[ cover]]
      calc( mlct$pri,
           function( pri) {
             ifelse( is.na( pri), NA,
                    ifelse( pri ==class, 1, 0))
           },
           filename= paste(
             mlctName,
             paste( cover, ".tif", sep=""),
             sep="_"),
           overwrite= TRUE, ...)
    }

在不熟悉的情况下,library( raster)它提供了一种与地理空间栅格数据集交互的巧妙机制,而无需将它们收集到内存中。这些函数在执行过程中逐块读取和写入数据。在这种情况下,工作人员都在读取相同的源数据,但写入单独的输出文件。我想知道这个文件 I/O 是否与上面报告的(看似良性的)错误有关。


现在它已经吐出了我预期的所有新文件,但这出现在控制台上:

GDAL Error 1: TIFFFetchDirectory:Sanity check on directory count failed, this is probably not a valid IFD offset

尽管核心是安静的,但解释器提示并没有再次出现。我猜是文件 I/O 以某种方式出错的另一个线索。有什么想法吗?

4

1 回答 1

1

我想我有答案。我在 GDAL-dev 列表上得到了 Even Rouault 的一些帮助。请参阅GDAL-dev 档案中的此线程(也可通过 Nabble 获得)。如果他出现,他应该得到这个答案的功劳,而不是我。

问题的症结在于我必须将栅格数据集的文件名传递给 foreach 工作人员,并在 foreach 闭包中重新实例化 raster() 对象。每个工人都需要有自己的 rgdal 句柄来读取输入数据。

新代码如下所示:

  fracDoparFun <- function( priFilename, ...) {
    foreach( cover= names( classes), .packages= "raster") %dopar% {
      class <- classes[[ cover]]
      frac <-
        calc( raster( priFilename),
             function( pri) {
               ifelse( is.na( pri), NA,
                      ifelse( pri ==class, 1, 0))
             },
             filename= paste(
               mlctName,
               paste( cover, ".tif", sep=""),
               sep="_"),
             overwrite= TRUE, ...)
      return( filename( frac))
    }
  }
mlct$fracs <-
  brick( stack( fracDoparFun( filename( mlct$pri), ...)),
        filename= fracsBrickFile,
        overwrite= TRUE,
        ...)

现在fracDoparFun()返回一个文件名列表,这些文件名是工作人员生成的输出,然后由brick()函数收集到单个多波段结果中。

谢谢大家看看。我希望我不会过早地关闭它,但我已经对其进行了测试,并且我想捕捉我所学到的东西。

于 2011-01-29T18:59:19.433 回答