代码之家  ›  专栏  ›  技术社区  ›  katefull06

在R中使用terra修改范围时,会为单独的SpatRaster重写范围

  •  1
  • katefull06  · 技术社区  · 6 月前

    这真是奇怪的行为,我无法解释。

    library(terra)
    
    r1 = rast(nrow = 2, ncol = 2)
    values(r1) = c(0, 1, 2, 3)
    r2 = r1
    ext(r2) = ext(r2)/2
    ext(r2)
    ext(r1)
    

    你看到的是,“r1”的范围也减少了一半。为什么??? 顺便说一句,您可以在不影响“r1”值的情况下更改“r2”的值。据我所知,它只适用于某种程度。

    使用“光栅”包执行相同过程时也不会发生这种情况。

    library(raster)
        
    r1 = raster(nrow = 2, ncol = 2)
    values(r1) = c(0, 1, 2, 3)
    r2 = r1
    extent(r2) = extent(r2)/2
    extent(r2)
    extent(r1)
    
    1 回复  |  直到 6 月前
        1
  •  2
  •   Andrea Manica    6 月前

    一个简单的任务 terra 创建浅拷贝,这意味着如果编辑派生对象,则可以更改原始对象。如果你想避免这种行为,解决方案是使用 deepcopy .文件 深度拷贝 显示了类似的行为 time 正如你所发现的 extent : https://rspatial.github.io/terra/reference/deepcopy.html

    编辑 :注意@Robert Hijmans的回答,他说 dev 版本 terra 现在表现不同,不需要 深度拷贝

        2
  •  2
  •   Robert Hijmans    6 月前

    这是一个现已在开发版本中修复的错误。

    这是一个变通办法 as.vector() :

    library(terra)
    r1 = rast(nrow = 2, ncol = 2)
    values(r1) = c(0, 1, 2, 3)
    r2 = r1
    ext(r2) = as.vector(ext(r2)/2)
    ext(r2)
    #SpatExtent : -90, 90, -45, 45 (xmin, xmax, ymin, ymax)
    ext(r1)
    #SpatExtent : -180, 180, -90, 90 (xmin, xmax, ymin, ymax)
    

    在开发版本中,它按预期工作

    library(terra)
    #terra 1.8.24
    r1 = rast(nrow = 2, ncol = 2)
    values(r1) = c(0, 1, 2, 3)
    r2 = r1
    ext(r2) = ext(r2)/2
    ext(r2)
    #SpatExtent : -90, 90, -45, 45 (xmin, xmax, ymin, ymax)
    ext(r1)
    #SpatExtent : -180, 180, -90, 90 (xmin, xmax, ymin, ymax)
    

    您可以使用安装开发版本

    install.packages('terra', repos='https://rspatial.r-universe.dev')