2010-08-26 45 views
1

考慮從browser()該輸出位於內部calcDistance值未被複制到下一個(本地)環境?

Called from: calcDistance(object = rst, xy = xy[[i]][j, ], effect.distance = effect.distance) 
Browse[1]> ls.str() 
effect.distance : num 236 
object : Formal class 'RasterLayer' [package "raster"] with 12 slots 
xy : Named num [1:2] -101.8 35.5 

Browse[1]> 
debugging in: xyValues(object = object, xy = xy, buffer = effect.distance) 
debug: standardGeneric("xyValues") 

Browse[2]> ls.str() 
object : Formal class 'RasterLayer' [package "raster"] with 12 slots 
xy : Named num [1:2] -101.8 35.5 

功能如下:simulationRun> createDistRaster> calcDistance>光柵:: xyValues。在上面的輸出中,你只能看到最後兩個。 xyValues來自光柵包。

第一段代碼顯示有三個對象存在:effect.distance,object,xy。 在第二段中,我們通過調用debug(xyValues)來進入xyValues。 在第三段中,我們可以看到effect.distance缺失。

我的問題是:即使objectxy似乎被複制到xyValues環境就好,effect.distance不是。這怎麼解釋?

我sessionInfo()

R version 2.11.1 (2010-05-31) 
i386-pc-mingw32 

locale: 
[1] LC_COLLATE=Slovenian_Slovenia.1250 LC_CTYPE=Slovenian_Slovenia.1250 
[3] LC_MONETARY=Slovenian_Slovenia.1250 LC_NUMERIC=C      
[5] LC_TIME=Slovenian_Slovenia.1250  

attached base packages: 
[1] splines stats  graphics grDevices utils  datasets methods 
[8] base  

other attached packages: 
[1] raster_1.3-11 foreach_1.3.0 codetools_0.2-2 iterators_1.0.3 
[5] Hmisc_3.8-2  survival_2.35-8 spam_0.22-0  splancs_2.01-27 
[9] sp_0.9-66  spatstat_1.20-2 deldir_0.0-12 mgcv_1.6-2  

loaded via a namespace (and not attached): 
[1] cluster_1.12.3  grid_2.11.1  lattice_0.18-8  Matrix_0.999375-39 
[5] nlme_3.1-96  tools_2.11.1 

回答

2

UPDATE: 這個問題是R郵件列表上還討論了,它竟然是在特定情況下傳遞的參數解析錯誤/不一致。這是報告給R.的討論,可以發現: Nabble


一個相當有趣的問題。當你檢查

showMethods("xyValues",incl=T) 

有兩個重要的代碼塊。具有xy的簽名向量和xy作爲矩陣的一個。由於你的對象是一個「RasterLayer」對象,你需要確保origin.point是一個矩陣。這是非常違反直覺實際上,如果我們看一下代碼

object="Raster", xy="vector" 
function (object, xy, ...) 
{ 
    if (length(xy) == 2) { 
     callGeneric(object, matrix(xy, ncol = 2), ...) 
    } 
    else { 
     stop("xy coordinates should be a two-column matrix or data.frame, or a vector of two numbers.") 
    } 
} 

所以實際上只是變換XY參數矩陣,並通過所有其他參數下一個通用的。下一個必須是這一個然後:

object="RasterLayer", xy="matrix" 
function (object, xy, ...) 
{ 
    .local <- function (object, xy, method = "simple", buffer = NULL, 
     fun = NULL, na.rm = TRUE) 
    { 
     if (dim(xy)[2] != 2) { 
      stop("xy has wrong dimensions; it should have 2 columns") 
     } 
     if (!is.null(buffer)) { 
      return(.xyvBuf(object, xy, buffer, fun, na.rm = na.rm)) 
     } 
     if (method == "bilinear") { 
      return(.bilinearValue(object, xy)) 
     } 
     else if (method == "simple") { 
      cells <- cellFromXY(object, xy) 
      return(.readCells(object, cells)) 
     } 
     else { 
      stop("invalid method argument. Should be simple or bilinear.") 
     } 
    } 
    .local(object, xy, ...) 
} 

這一個採取參數「緩衝區」。爲什麼參數值無法在分析樹中找到,我沒有任何線索,但可以嘗試通過給出矩陣作爲輸入而不是向量來避免方法級聯。

+0

該函數的作者已經通過向所有方法添加明確的參數緩衝區和樂趣來解決了問題。正如Joris指出的那樣,將緩衝區參數作爲矩陣傳遞給了竅門。將緩衝區變量存儲在全局環境中也會起到一定的作用。這並不重要,因爲它已經在原始功能中得到了修復。 :) – 2010-08-27 07:05:11

1

buffer參數通過...參數傳遞。在調試模式下鍵入str(list(...))

+0

的確,這個論證本身已經通過了,我說錯了。參數的值不是,它從分析樹中消失,無法找回。因此錯誤。感謝您的更正。 – 2010-08-27 09:27:59

相關問題