R 为什么光栅点在第一次调用时生成错误,而不是在第二次调用时生成错误?

R 为什么光栅点在第一次调用时生成错误,而不是在第二次调用时生成错误?,r,rcpp,spatial,r-raster,R,Rcpp,Spatial,R Raster,我有一些代码在研究ID(ID)列表上循环,并将它们转换为单独的多边形/空间点。在第一次执行循环时,它会产生以下错误: (函数(x)中出错:尝试应用非函数 这是来自raster::rasterToPoints函数。我已经查看了该函数帮助部分中的示例,传递fun=NULL似乎是一种可以接受的方法(过滤掉所有NA值)。所有值都等于1,所以我尝试传递一个简单的函数,如函数(x){x==1}。当这不起作用时,我也尝试仅抑制错误消息,但使用try()或tryCatch()时没有任何运气 主要问题: 1.为什

我有一些代码在研究ID(
ID
)列表上循环,并将它们转换为单独的多边形/空间点。在第一次执行循环时,它会产生以下错误:

(函数(x)中出错:尝试应用非函数

这是来自raster::rasterToPoints函数。我已经查看了该函数帮助部分中的示例,传递fun=NULL似乎是一种可以接受的方法(过滤掉所有NA值)。所有值都等于1,所以我尝试传递一个简单的函数,如函数(x){x==1}。当这不起作用时,我也尝试仅抑制错误消息,但使用try()或tryCatch()时没有任何运气

主要问题:
1.为什么会产生错误?
2.为什么只在循环的第一次运行时显示错误?

可复制示例:

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"))
}

库(ggplot2)
图书馆(光栅)
图书馆(sf)
图书馆(dplyr)
pacific这些是错误消息,但不是严格意义上的错误,因为脚本继续运行,并且结果不会受到影响。我所知道的是,这与垃圾收集(从内存中删除不再使用的对象)有关,这使得很难确定是什么导致了它(下面你可以看到一个稍加修改的例子,它暗示了另一个罪犯),以及为什么它不总是发生在同一地点

这些消息最终源于使用raster::rasterize(就像使用
raster
包的Rcpp模块一样)。我在几个使用Rcpp模块的R包中看到了这些消息。下面是在
terra
包的上下文中进行的讨论

我不知道这是否是我这方面的一些糟糕的编程,或者其他什么。所以感谢你创建了这个例子。希望有更多知识的人可以插话

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
库(ggplot2)
图书馆(光栅)
图书馆(sf)
图书馆(dplyr)

pac_mod Hi Robert。这对我来说是个新闻。如果你能将空间代码和链接需求的示例最小化,我可以从Rcpp方面攻击它。我们在许多上下文中使用Rcpp模块已经很多年了——目前还没有这样的消息。我从未在没有模块的包中见过它(或在我添加模块之前的
光栅中);我在几个带有模块的软件包中看到过它,也在一些更简单的非空间软件包中看到过,如
Rquefts
Rwofost
。但我无法用这些软件包创建一个可复制的示例。我将继续寻找一个——这可能需要一段时间。我在上面提到的github/terra问题中添加了另一个示例,但我知道你想要更简单的。我找到后会告诉你的。谢谢。太棒了!我会尽我所能帮助你,但整个地理堆栈对我来说有点陌生。