bugfix> r > 投稿

リーフレットマップから複数の地区を選択し、選択入力ボックスを更新しようとしています。その後、[移動]ボタンをクリックすると、選択した地区に関する情報を示す新しいタブが表示されます。 つまり、クリックするたびに選択入力が再起動されないように、Multi Selectに応答するマップを持っているか、以前のクリックのキャッシュをどこかに保存する必要があります。

コードを添付します。

どんな助けも役に立ちます。

library(shiny)
library(rgdal)
library(leaflet)
library(raster)
library(tmap)
library(shinyjs)
India <- getData("GADM", country = "India", level = 2)
wb <- subset(India, NAME_1 == "West Bengal")
#making a dummy dataframe x
x<-data.frame(wb$NAME_2,wb$ID_2)
KPI<-1:20
x<-cbind(x,KPI)
y<-vector()
edit<-NULL
ui <-fluidPage(
  #use shinyjs
  #plotOutput("shpPlot"),
  leafletOutput("Mapp"),
  selectizeInput("indistrict1","select",choices=wb$NAME_2, multiple=TRUE, 
                 options = list(maxItems = 3)),
  tabsetPanel(id = "inTabset",
              tabPanel("tab_1",actionButton("Button1", "Go")),
              tabPanel("tab_2",actionButton("Button2", "Back" ), tableOutput("q"))
  )
  #tableOutput("my_table")
) 
server <- function(input, output, session){
  output$Mapp<-renderLeaflet({
    leaflet() %>% addPolygons(data = wb, highlightOptions = 
                                highlightOptions(color = "red", weight = 3, bringToFront = TRUE), layerId = 
                                wb$ID_2)
  })
  #Go Button Work
  observeEvent(input$Button1,{
    updateTabsetPanel(session, "inTabset", selected = "tab_2")
  })
  observeEvent(input$Button2,{
    updateTabsetPanel(session, "inTabset", selected = "tab_1")
  })
  #click event work
  data<- reactiveValues(clicked = NULL)
  z<-reactive({
    df <- data.frame(x)
    colnames(df) <- c("district","id","kpi")
    df
  })
  observeEvent(input$Mapp_shape_click,{
    data$clicked <- input$Mapp_shape_click
    y<-subset(z(), id == data$clicked$id)
    edit<-unique(as.character(y$district))
    updateSelectizeInput(session, "indistrict1",
                         label = "select",
                         choices = c(unique(as.character(y$district)),"All 
                                     Districts"),
                         selected = edit,
                         options = list(maxItems = 3),
                         server = TRUE
                         )
  })
  observeEvent(input$indistrict1,{
    output$q<-renderTable({
      subset(z(), district %in% input$indistrict1)
    })
  })  
}
shinyApp(ui = ui,server = server)

回答 1 件
  • これはほんの始まりに過ぎませんが、役に立つかもしれません。

    現時点では、リーフレットマップでのクリックのみをリッスンしていますが、クリックされたシェイプIDは保存されているため、マップで強調表示されてテーブルに表示される複数のシェープファイルをクリックできます。 ただし、クリックしたシェープファイルを削除することはできません(シェープファイルをもう一度クリックすることにより)。 selectInputでのシェープファイルの選択も今のところ機能しません。selectInputはクリックされたシェープファイルでのみ更新されます。

    library(shiny)
    library(leaflet)
    library(raster)
    library(DT)
    India <- getData("GADM", country = "India", level = 2)
    wb <- subset(India, NAME_1 == "West Bengal")
    ui <- {fluidPage(
      uiOutput("raumselect"),
      leafletOutput("map"),
      DT::dataTableOutput("mytable")
    )}
    
    server <- shinyServer(function(input, output, session) {
      indiashape <- reactiveValues(geom = wb)
      click_list <- reactiveValues(ids = vector())
      selectedLines <- reactiveValues(geom = NULL)
      output$raumselect <- renderUI({
        click <- input$map_shape_click
        sel_lines_name <- as.character(indiashape$geom[as.character(
          indiashape$geom$OBJECTID) %in% click_list$ids, ]$NAME_2)
        selectInput("nameslanes", choices = wb$NAME_2,
                    selected = sel_lines_name,
                    label = "Select a Line Segment:", multiple = T)
      })
      output$map <- renderLeaflet({
        mapl <- leaflet(options = leafletOptions(doubleClickZoom= FALSE)) %>% 
          addTiles() %>% 
          addPolylines(data = indiashape$geom,
                       layerId = as.character(indiashape$geom$OBJECTID),
                       group = indiashape$geom$TYPE_2,
                       color = "blue",
                       highlightOptions = highlightOptions(color="red", weight = 10, bringToFront = T, opacity = 1))        
        mapl
      })
      observeEvent(input$map_shape_click, {
        click <- input$map_shape_click
        proxy <- leafletProxy("map")
        click_list$ids <- c(click_list$ids, click$id)
        sel_lines <- indiashape$geom[as.character(indiashape$geom$OBJECTID) %in% click_list$ids, ]
        proxy %>% addPolylines(data = sel_lines, 
                               layerId = as.character(sel_lines@data$osm_id), 
                               color="red", weight=5,opacity=1)
        selectedLines$geom <- sel_lines
      })
      output$mytable <- DT::renderDataTable({
        req(selectedLines$geom)
        if (!is.null(selectedLines$geom)) {
          sel_lines <- selectedLines$geom
          datafr <- as.data.frame(cbind(
            as.numeric(sel_lines$OBJECTID),
            as.character(sel_lines$NAME_2)
          ))
        }
        colnames(datafr) <- c("OBJECTID", "Name")
        datatable(data = datafr, rownames = T)
      })
    })
    shinyApp(ui, server)
    
    

あなたの答え