library(foreach) library(parallel) library(doParallel) library(raster) library(rgeos) library(rgdal) library(sp) library(geosphere) print("Packages loaded") PredExtr <- function(points, toextract, output, chunkn, ncores){ print("Loading data") print(paste("Chunk no.", chunkn)) print(toextract) mypredictor <- readOGR(toextract) mypoints <- readOGR(points) indices <- 1:length(mypoints) chunks <- split(indices, sort(indices%%99)) print(paste("Working on", paste0(head(chunks[[chunkn]]), collapse=" "), "...", paste0(tail(chunks[[chunkn]]), collapse=" " ))) print("go parallel") cl <- makeForkCluster(ncores, outfile="" ) registerDoParallel(cl) print("start main foreach loop") if(!identical(crs(mypredictor), crs(mypoints))) {mypredictor <- spTransform(mypredictor, crs(mypoints))} nearestPredictor <- foreach(i=chunks[[chunkn]], .packages=c('raster'), .combine=rbind) %dopar% { nearestPredictor.tmp <- tryCatch(data.frame(mypoints[i,"PlotID"], geosphere::dist2Line(mypoints[i,], mypredictor)), error = function(e){data.frame(mypoints[i,"PlotID"], distance=NA, lon=NA, lat=NA, ID=NA)} ) return(nearestPredictor.tmp) print(paste("plot no.", i, "done")) } print(paste("printing to output", output)) write.csv(nearestPredictor, file = output) }