I want to create polygons inside an apply and want to do this as quickly as possible from a matrix of coordinates. I have some code and realized this is one of the slowest parts of my code. How can I do this efficiently? I tried two different approaches:
Approach 1
library(sp)
library(terra)    
t0 <- Sys.time()
poly_list <- apply(matrix(1:10000), 1, function(idx){      
  # set coordinates
  coords <- cbind(rnorm(100), rnorm(100))      
  # create polygon
  Polygons(list(Polygon(coords)), idx)
})
  
# convert to terra polygons
poly_terra <- vect(SpatialPolygons(poly_list))
# show time passed
print(Sys.time() - t0)   
# Time difference of 2.082166 secs
Approach 2
t0 <- Sys.time()    
poly_list <- apply(matrix(1:10000), 1, function(idx){      
  # set coordinates
  coords <- cbind(rnorm(100), rnorm(100))      
  # create polygon
  vect(coords, type = "polygon")
})
# convert to terra polygons
poly_terra <- vect(poly_list)
print(Sys.time() - t0)
# Time difference of 16.38044 secs
Why is it faster to create sp polygons and convert them afterwards than directly creating terra polygons? The code with vect(SpatialPolygons(Polygons(list(Polygon(coords)), idx))) seems somewhat complicated. Is there a faster or at least more elegant way?
Edit Currently my fastest option, although it feels illegal:
t0 <- Sys.time()    
dummy <- Polygons(list(Polygon(cbind(rep(0,4), rep(0,4)))), "0")   
poly_list <- apply(matrix(1:10000), 1, function(idx){
  
  # set coordinates
  coords <- cbind(rnorm(100), rnorm(100))     
  # create polygon
  new <- dummy
  new@ID <- as.character(idx)
  new@Polygons[[1]]@coords <- coords
  return(new)
})
# convert to terra polygons
poly_terra <- vect(SpatialPolygons(poly_list))
print(Sys.time() - t0)
# Time difference of 0.7147191 secs
 
     
    

