矢量化函数,调用数据帧以在 raster::overlay() 中使用

问题描述 投票:0回答:1

我有一个函数可以根据数据帧中指定的给定条件更改 RasterLayer。我想使用 override() 函数来调用此函数来更改 RasterStack,但在矢量化我的函数时遇到问题。

这是我使用虚拟数据所做的示例:

library(raster)
library(dplyr)

#generate dummy dataframe
df <- data.frame(matrix(nrow=3,ncol=43))
colnames(df) <- c("date_start", "date_end", "pixel_id")
df$date_start <- seq(as.Date("2024-01-01"), as.Date("2024-01-03"), by="+1 day")
df$date_end <- seq(as.Date("2024-02-01"), as.Date("2024-02-03"), by="+1 day")
df$pixel_id <- c(1,2,3)

#generate raster with pixel ids
id_raster <- raster(nrow=3, ncol=3, xmn=-123, xmx=-121, ymn=43, ymx=45) %>% setValues(seq(1,9))

#make a raster stack for editing
stackable <- id_raster / id_raster # make one blank raster
daylist <- seq(as.Date("2024-01-01"), as.Date("2024-02-03"), by="+1 day")
stack <- stack(replicate(length(daylist), stackable)) %>% setZ(daylist) # make a stack of rasters with one layer for every day of interest

#set function to apply to each layer
fun <- function(layer, id_raster,...) {
    day <- getZ(layer)
    day_data <- df %>% filter(date_start <= as.Date(day)) %>% filter(date_end >= as.Date(day))
    new_layer <- Which((id_raster %in% day_data$pixel_id), na.rm=F, cells=F)
    new_layer <- new_layer + layer
    return(new_layer)}

#use overlay to apply my function to each layer of the stack
new_stack <- overlay(stack, id_raster, fun=Vectorize(fun))

当我运行此命令时,最后一行返回错误:“无法使用此公式,可能是因为它未矢量化。”所以我假设我以某种方式错误地使用了 Vectorize() 函数。

这个问题与我的问题很接近,但是函数调用列表,而我的函数调用数据帧。不知何故,这一定会有所不同,因为简单地使用 Vectorize() 调用对我来说并不像对他们那样有效。

我尝试使用各种语法向 Vectorize() 调用添加 vectorize.args 参数,但我要么仍然遇到相同的错误,要么我的代码似乎无休止地运行(对于如此小的数据集,这不应该发生)。

r stack vectorization overlay raster
1个回答
0
投票
# Modified function to accept filtered dataframe
fun <- function(layer, id_raster, day_data) {
  new_layer <- which(id_raster[] %in% day_data$pixel_id, arr.ind = TRUE)
  layer[new_layer] <- layer[new_layer] + 1
  return(layer)
}

# Apply function using calc
new_stack <- calc(stack, fun = function(x) fun(x, id_raster, df))
© www.soinside.com 2019 - 2024. All rights reserved.