在R中添加大型栅格时,@ data @值会发生什么变化?

时间:2014-01-13 21:07:57

标签: r

简单的算术运算与小栅格一起工作,例如:

> r1 <- raster(ncol=5, nrow=5)
> r1[] <- rep(1, 5 * 5)
> class(r1@data@values)
[1] "numeric"
> class((r1 + r1)@data@values)
[1] "numeric"

但是当我使用更大的栅格时,会发生奇怪的事情:

> r1 <- raster(ncol=5000, nrow=5000)
> r1[] <- rep(1, 5000 * 5000)
> r2 <- r1 + r1
> class(r2@data@values)
[1] "logical"

为什么r2@data@values成为logical? 此结果对象在后续计算中无法使用, 一般而言,它表现得很奇怪,例如:

> summary(r1@data@values)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
      1       1       1       1       1       1 
> summary(r2@data@values)
   Mode    NA's 
logical       0 
> object.size(r1)
200011576 bytes
> object.size(r2)
12112 bytes

基本上r2看起来很糟糕。

作为一种解决方法,添加@data@values似乎工作正常:

> r3 <- r1
> r3@data@values <- r1@data@values * 2
> class(r3@data@values)
[1] "numeric"

但是,你如何解释只有大型栅格才能发生的这种行为?

1 个答案:

答案 0 :(得分:3)

logical是因为raster对象指向存储实际值的磁盘上的临时文件,而不是将2500万个数值存储在内存中。这些值完全可用于后续算术方法。使用@data@values插槽设置值是一个问题。使用提供的算术方法或使用setValues()函数。

详情请见?Arith-methods帮助页面:

  

如果输出Raster *的值无法保存在内存中,它们将保存到临时文件中。您可以使用选项设置默认文件格式,数据类型和进度条。

鉴于上面的r2对象,您可以像存储在内存中的对象一样使用它。这是raster做得很好的一件事 - 它与存储在磁盘上的文件无缝协作,就像它们是常规的内存中对象一样。

r3 <- r2^2
r3
#class       : RasterLayer 
#dimensions  : 5000, 5000, 2.5e+07  (nrow, ncol, ncell)
#resolution  : 0.072, 0.036  (x, y)
#extent      : -180, 180, -90, 90  (xmin, xmax, ymin, ymax)
#coord. ref. : +proj=longlat +datum=WGS84 
#data source : /private/var/folders/ck/1x5j5jvx5mq17clf5r32gg540000gn/T/R_raster_tmp/Simon/raster_tmp_2014-01-13_214043_710579.grd 
#names       : layer 
#values      : 4, 4  (min, max)

请注意,图层的值已正确返回为4,即2^2