我正在尝试使用降雪包对我的数据(NDVI最大栅格堆栈)运行MBLM。我想要一个包含三列的数据框作为我的输出(斜率,截距,每个像素可用的日期数),其中有很多丢失的数据(NA),因此我创建了一个函数,如果没有数据,该函数将为第三列返回0。
这是我正在使用的函数,其中val100是我原始Val的特定列数,栅格堆栈被强制转换为一个数据帧,其中包含30年跨度的每个像素最大NDVI
val = as.data.frame(NDVI.max.masked.184028)
val100 = val[c(1080700:1080737),] # Random selection of data to try and determine where the function isn't working
TREND = function (x) {
dat = val100[x,]
print(x)
names(dat) = paste(substr(names(dat), 19,22))
add_column(dat, "2012" = NA, .before = "2013")
if(sum(as.numeric(!is.na(dat[])))==0) {return (c(NA, NA, 0))} else if (
sum(as.numeric(!is.na(dat[])))>0 & sum(as.numeric(is.na(dat[])))>0) {
sumNA = sum(as.numeric(!is.na(dat[])))
##FONCTION QUI GARDE COMBIEN DE RASTERS NA
dat <- dat[-which(is.na(dat[]))]
dat=data.frame(Year = names(dat), NARI = as.vector(as.numeric(dat)))
dat$Year = as.numeric(as.character(dat$Year))
mod <- mblm(NARI ~Year, data=dat)
return(c(as.numeric(c(mod$coefficients[1], mod$coefficients[2])),sumNA)) } else if (
sum(as.numeric(!is.na(dat[])))>0 & sum(as.numeric(is.na(dat[])))==0) {
names(dat) = paste(substr(names(dat), 19,22))
dat = data.frame(Year= names(dat), NARI = as.vector(as.numeric(dat)))
dat$Year = as.numeric(as.character(dat$Year))
mod <- mblm(NARI ~Year, data=dat)
return(c(as.numeric(c(mod$coefficients[1], mod$coefficients[2])), sumNA)) }
}
## Snowfall package
Start = Sys.time()
sfInit(cpus=6,type='SOCK',parallel=TRUE)
sfExport("val100", "TREND")
sfLibrary(mblm)
sfLibrary(tibble)
RES_ARI = sfLapply(1:nrow(val),TREND)
sfStop()
End = Sys.time()
Timetotal = End - Start
我希望该函数返回具有三列的数据帧作为输出。 当我手动使用该函数时,该函数起作用,但是当我使用降雪包(必要时,因为要排序1400000像素),它将返回错误:
“ checkForRemoteErrors(val)中的错误:一个节点产生了一个错误:尝试将属性设置为NULL”