【问题标题】:mysterious error from foreach来自foreach的神秘错误
【发布时间】:2011-01-28 18:44:26
【问题描述】:

在我第一次尝试 foreach 时,我遇到了这个错误:

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

我为每个工人得到一个。

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

起初我认为这是由于我的 foreach 调用中的函数试图将其发送到控制台的文本进度条造成的,但在关闭它后我仍然收到错误消息。尽管出现错误,评估仍在继续,所有仓鼠似乎都在运行。里面的函数恰好是 来自库(光栅)的重分类() 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 以某种方式出错的另一个线索。有什么想法吗?

【问题讨论】:

    标签: r foreach raster gdal


    【解决方案1】:

    我想我有答案。我在 GDAL-dev 列表上得到了 Even Rouault 的一些帮助。请参阅此线程in the GDAL-dev archives(也可通过 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() 函数收集到单个多波段结果中。

    感谢大家观看。我希望我不会过早地结束它,但我已经对其进行了测试,并且我想记录我所学到的东西。

    【讨论】:

      猜你喜欢
      • 2013-03-29
      • 2015-03-13
      • 2017-04-20
      • 2014-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多