2010-08-26 58 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

相关问题