混淆源于sum 的工作方式。我将使用 R 附带的示例文件以便于重现
library(raster)
f <- system.file("external/test.grd", package="raster")
r <- raster(f)
s <- stack(r, r*2)
## equivalent to calc(s, sum)
sum(s, na.rm=FALSE)
#class : RasterLayer
#dimensions : 115, 80, 9200 (nrow, ncol, ncell)
#resolution : 40, 40 (x, y)
#values : 416.1212, 5208.174 (min, max)
sum(s, na.rm=TRUE)
#class : RasterLayer
#dimensions : 115, 80, 9200 (nrow, ncol, ncell)
#resolution : 40, 40 (x, y)
#values : 0, 5208.174 (min, max)
注意最小值的差异(0 与 416.1212)。这是因为sum 的工作原理。
sum(c(NA, NA))
#[1] NA
sum(c(NA, NA), na.rm=TRUE)
#[1] 0
无之和为零,而一个或多个NAs 之和为NA。
在您使用 worldclim 数据的情况下,没有理由使用 na.rm=TRUE。否则你可以在calc之后使用mask。
terra 不是这种情况:
library(terra)
x <- rast(s)
sum(x, na.rm=TRUE)
#class : SpatRaster
#dimensions : 115, 80, 1 (nrow, ncol, nlyr)
#resolution : 40, 40 (x, y)
#extent : 178400, 181600, 329400, 334000 (xmin, xmax, ymin, ymax)
#coord. ref. : +proj=sterea +lat_0=52.1561605555556 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +datum=WGS84 +units=m +no_defs
#source : memory
#name : sum
#min value : 416.1212
#max value : 5208.174
app(x, sum, na.rm=TRUE)
#class : SpatRaster
#dimensions : 115, 80, 1 (nrow, ncol, nlyr)
#resolution : 40, 40 (x, y)
#extent : 178400, 181600, 329400, 334000 (xmin, xmax, ymin, ymax)
#coord. ref. : +proj=sterea +lat_0=52.1561605555556 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +datum=WGS84 +units=m +no_defs
#source : memory
#name : sum
#min value : 416.1212
#max value : 5208.174
甚至认为这与基本 R 有点不一致,但我认为在栅格数据的上下文中这样做会更好。获得与 base-R 和 raster 相同的行为
app(x, function(i) sum(i, na.rm=TRUE))
#class : SpatRaster
#dimensions : 115, 80, 1 (nrow, ncol, nlyr)
#resolution : 40, 40 (x, y)
#extent : 178400, 181600, 329400, 334000 (xmin, xmax, ymin, ymax)
#coord. ref. : +proj=sterea +lat_0=52.1561605555556 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +datum=WGS84 +units=m +no_defs
#source : memory
#name : lyr.1
#min value : 0
#max value : 5208.174