0

这是来自mapedit问题 github 页面交叉帖子。我正在尝试构建一个闪亮的应用程序,允许用户在使用mapedit包选择多边形后绘制数据子集。虽然我能够使用 成功绘制数据,但在删除选定的 mapedit 多边形后mapedit,我无法刷新数据。$finished

这会产生两个我尚未确定解决方法的错误,1)如果情节崩溃,如错误下方的 gif 中所示the argument is of length zero,以及 2)如果情节没有崩溃,最后选择的$finished数据仍然无法清除来自情节的数据。

有什么办法可以解决这些问题吗?这主要发生在绘制两个以上的多边形然后删除时。虽然我认为会有一个被动的解决方法,但到目前为止我还没有成功。

下面是来自 r-spatial博客mapedit 的可重现示例 - 0.2.0 中的更新。在我闪亮的应用程序中,我使用 mapedit 包使用对象 ID 对不同的时间序列进行子集化,并在 plotly 中绘制时间序列。我相信可以使用下面的可重现示例来解决根本问题。

library(sf)    
# make the coordinates a numeric matrix
qk_mx <- data.matrix(quakes[,2:1])
# convert the coordinates to a multipoint feature
qk_mp <- st_multipoint(qk_mx)
# convert the multipoint feature to sf
qk_sf <- st_sf(st_cast(st_sfc(qk_mp), "POINT"), quakes, crs=4326)

# run select demo for the quake data
#  we will need the qk_sf
#  to test
# plot(qk_sf)

library(mapedit)
library(mapview)
library(shiny)

ui <- fluidPage(
  fluidRow(
    # edit module ui
    column(6, editModUI("editor")),
    column(
      6,
      h3("Boxplot of Depth"),
      plotOutput("selectstat")
    )
  )
)
server <- function(input, output, session) {
  # edit module returns sf
  edits <- callModule(editMod, "editor", mapview(qk_sf)@map)

  output$selectstat <- renderPlot({
    req(edits()$finished)
    qk_intersect <- st_intersection(edits()$finished, qk_sf)
    req(nrow(qk_intersect) > 0) 
    boxplot(
      list(
        all = as.numeric(qk_sf$depth),
        selected = as.numeric(qk_intersect$depth)
      ),
      xlab = "depth"
    )
  })
}
shinyApp(ui, server)

错误示例

虽然我已经在 mapedit github问题页面和 r-spatial 中发布了这个,但我认为是否有不需要包修复的解决方案是值得的。我在这里这里找到了 selectMod 的两种解决方法,但是 editMod 源代码要复杂得多,所以我发现它超出了我的能力来适应这个解决方案。

非常感谢,我断断续续地努力解决这个问题几个星期,我很想解决这个问题并关闭这个项目。

4

2 回答 2

0

我找到了一个简单的绕过解决方案来处理这个问题。在进行下一个选择之前,我们必须清除多边形或矩形选择器。另外,如果我们不先清除选择,之前选择的数据将附加到后面的选择中。

于 2022-01-12T17:23:44.953 回答
0

这已在 GitHub 上解决,网址为https://github.com/r-spatial/mapedit/issues/106remotes::install_github("r-spatial/mapedit")解决了等待包修复的 mapedit 源代码中的问题。

于 2020-10-29T16:36:41.500 回答