从R'并行化st#u union;s sf包

从R'并行化st#u union;s sf包,r,sf,R,Sf,我有一些包含数百万个多边形的大型形状文件,需要进行分解。根据形状文件的不同,我需要按组分解,或者只使用st_union进行所有操作。我一直在使用st_par,它对大多数sf应用程序都非常有效。虽然当我在st_union上使用此函数时,它会返回一个列表,我不知道如何并行化sf dissole函数st_union 任何建议都会非常有用!下面是一个小代码片段来说明我的观点 library(sf) library(assertthat) library(parallel) us_shp <- "

我有一些包含数百万个多边形的大型形状文件,需要进行分解。根据形状文件的不同,我需要按组分解,或者只使用
st_union
进行所有操作。我一直在使用
st_par
,它对大多数sf应用程序都非常有效。虽然当我在
st_union
上使用此函数时,它会返回一个列表,我不知道如何并行化sf dissole函数
st_union

任何建议都会非常有用!下面是一个小代码片段来说明我的观点

library(sf)
library(assertthat)
library(parallel)

us_shp <- "data/cb_2016_us_state_20m/cb_2016_us_state_20m.shp"
if (!file.exists(us_shp)) {
  loc <- "https://www2.census.gov/geo/tiger/GENZ2016/shp/cb_2016_us_state_20m.zip"
  dest <- paste0("data/cb_2016_us_state_20m", ".zip")
  download.file(loc, dest)
  unzip(dest, exdir = "data/cb_2016_us_state_20m")
  unlink(dest)
  assert_that(file.exists(us_shp))
}

usa <- st_read("data/cb_2016_us_state_20m/cb_2016_us_state_20m.shp", quiet= TRUE) %>%
  filter(!(STUSPS %in% c("AK", "HI", "PR")))

test <- usa %>%
  st_par(., st_union, n_cores = 2)
库(sf)
图书馆(资产)
图书馆(平行)

us_shp我认为您只需对原版稍加修改即可解决您的具体问题。
不过,这只是一个快速而大胆的修复,可能会破坏该函数其他用途的代码。
函数的作者当然可以提供更好的修复

library(parallel)
# Paralise any simple features analysis.
st_par <- function(sf_df, sf_func, n_cores, ...){

    # Create a vector to split the data set up by.
    split_vector <- rep(1:n_cores, each = nrow(sf_df) / n_cores, length.out = nrow(sf_df))

    # Perform GIS analysis
    split_results <- split(sf_df, split_vector) %>%
        mclapply(function(x) sf_func(x), mc.cores = n_cores)

    # Combine results back together. Method of combining depends on the output from the function.
    if ( length(class(split_results[[1]]))>1 | class(split_results[[1]])[1] == 'list' ){
        result <- do.call("c", split_results)
        names(result) <- NULL
    } else {
        result <- do.call("rbind", split_results)
    }

    # Return result
    return(result)
}
库(并行)
#将任何简单的特征分析并行化。

st_par很好的主题和很好的示例,但是
us_prefix
没有定义,您还应该添加所使用的包。感谢您的提示-我修复了未定义的对象(虽然我在编写过程中已经删除了该对象)并添加了libs。感谢您的回复!这对st_union非常有效,但对其他操作无效-这正是我所希望的。这是向前迈出的一大步,将使我能够继续工作。同时,我想我会采纳你的建议,试着联系函数的作者,看看它是否能更适合
sf
软件包。太好了!如果你从作者那里收到有趣的反馈,你能在这里发一条消息让我知道吗?谢谢我当然会的。再次感谢您的帮助,我将与您联系。st_par函数的创建者Phil Donovan对其进行了更新,使其对其他类型的sf对象更为健壮。。。