У меня есть код, который перебирает список идентификаторов исследований (ids
) и превращает их в отдельные полигоны / пространственные точки. При первом выполнении l oop выдается следующая ошибка:
Ошибка в (функция (x): попытка применить не-функцию
Это из растра :: rasterToPoints Я рассмотрел примеры в разделе справки для этой функции, и передача fun = NULL представляется приемлемым методом (отфильтровывает все значения NA). Все значения в любом случае равны 1, поэтому я попытался передать простую функцию как это предлагает, например, function (x) {x == 1}. Когда это не сработало, я также пытался просто подавить сообщение об ошибке, но безуспешно, используя try () или tryCatch ().
Основные вопросы:
1. Почему это вообще приводит к ошибке?
2. Почему отображается только ошибка при первом прогоне l oop?
Воспроизводимый пример:
library(ggplot2)
library(raster)
library(sf)
library(dplyr)
pacific <- map_data("world2")
pac_mod <- pacific
coordinates(pac_mod) <- ~long+lat
proj4string(pac_mod) <- CRS("+init=epsg:4326")
pac_mod2 <- spTransform(pac_mod, CRS("+init=epsg:4326"))
pac_rast <- raster(pac_mod2, resolution=0.5)
values(pac_rast) <- 1
all_diet_density_samples <- data.frame(
lat_min = c(35, 35),
lat_max = c(65, 65),
lon_min = c(140, 180),
lon_max = c(180, 235),
sample_replicates = c(38, 278),
id= c(1,2)
)
ids <- all_diet_density_samples$id
for (idnum in ids){
poly1 = all_diet_density_samples[idnum,]
pol = st_sfc(st_polygon(list(cbind(c(poly1$lon_min, poly1$lon_min, poly1$lon_max, poly1$lon_max, poly1$lon_min), c(poly1$lat_min, poly1$lat_max, poly1$lat_max, poly1$lat_min, poly1$lat_min)))))
pol_sf = st_as_sf(pol)
x <- rasterize(pol_sf, pac_rast)
df1 <- raster::rasterToPoints(x, fun=NULL, spatial=FALSE) #ERROR HERE
df2 <- as.data.frame(df1)
density_poly <- all_diet_density_samples %>% filter(id == idnum) %>% pull(sample_replicates)
df2$density <- density_poly
write.csv(df2, paste0("pol_", idnum, ".csv"))
}
Любая помощь будет принята с благодарностью!