Почему rasterToPoints генерирует ошибку при первом вызове, а не во втором? - PullRequest
1 голос
/ 04 мая 2020

У меня есть код, который перебирает список идентификаторов исследований (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"))
}

Любая помощь будет принята с благодарностью!

1 Ответ

1 голос
/ 06 мая 2020

Это сообщения об ошибках , но не ошибки в строгом смысле, поскольку скрипт продолжает работать, и на результаты это не влияет. Все, что я знаю, это то, что это связано со сборкой мусора (удалением из меме объектов, которые больше не используются), и это затрудняет точное определение причин (это ниже вы можете увидеть слегка измененный пример, который предлагает другого виновника), и почему это не всегда происходит в одном месте.

Сообщения в конечном итоге происходят от использования raster :: rasterize (как при использовании модуля R cpp пакета raster). Я вижу эти сообщения в нескольких пакетах R, которые используют R cpp modules . Это обсуждение в контексте пакета terra https://github.com/rspatial/terra/issues/30

Я не знаю, является ли это плохим программированием на моей стороне или чем-то еще. Так что спасибо за создание этого примера. Надеюсь, кто-то более знающий может присоединиться.

library(ggplot2)
library(raster)
library(sf)
library(dplyr)

pac_mod <- map_data("world2")
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)
#Error in x$.self$finalize() : attempt to apply non-function
#Error in x$.self$finalize() : attempt to apply non-function
#Error in x$.self$finalize() : attempt to apply non-function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...