简单的算术运算与小栅格一起工作,例如:
> 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"
但是,你如何解释只有大型栅格才能发生的这种行为?
答案 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
。