r - 单击栏时更新 R Shiny 的 Dececkgl map

标签 r shiny shinydashboard

尝试制作具有这些属性的 Shiny 应用程序。

默认 View 是聚合层。将有许多列/条。单击列后, View 将更新以显示数据的非聚合版本。

这就像知道哪个栏被点击并过滤与之相关的数据。

我编写了下面的代码,它执行聚合层。但不确定如何获取“clicked_on_this_bar”详细信息。在这里,如果我们得到,用户单击“区域 A”的栏,那么我们可以使用区域 A 过滤 orig_df 并更新 View 。如何进行此操作?

rm( list = ls() )

library( shiny ) ; library( shinydashboard ) ; library( dplyr ) ; library( deckgl )

ui <- basicPage( deckglOutput( 'map', height = '800px' ) )

server <- function(input, output) {

aggregate_df = data.frame( 'area' = LETTERS[1:2], 'count' = 110:111, median_lon = c( 3.39, 3.41 ),
                         
                         median_lat = c( 49.7, 49.4 ), color = c("#0080FF", "#FF0080") )

orig_df = data.frame( 'area' = rep( c( 'A', 'B' ), c( 3, 2 ) ), count = 10:14, lon = c( 3.45, 3.39, 3.19, 3.41, 3.92 ),
                    
                    lat = c( 48, 49.7, 52, 49.4, 51.5 ), color = c("#0080FF", "#FF0080", "#FF3030", "#00EE00", '#FF7F24') )                    


output$map = renderDeckgl({

deckgl( zoom = 7, pitch = 35, latitude = 48.29507, longitude = 4.0731520 ) %>%
  
  add_column_layer(
    data = aggregate_df,
    getPosition = ~median_lon + median_lat,
    getElevation = ~count,
    getFillColor = ~color,
    getTooltip = "Area: {{area}}, Count: {{count}}",
    elevationScale = 100
  ) %>% add_basemap()

})


# observeEvent({
#   
#   deckgl_proxy( 'map' ) %>%
#     
#     add_column_layer(
#       data = orig_df %>% filter( area == click[['A']] ),
#       getPosition = ~lon + lat,
#       getElevation = ~count,
#       getFillColor = ~color,
#       getTooltip = "Area: {{area}}, Count: {{count}}",
#       elevationScale = 50
#     ) %>% update_deckgl(it = "works")
#   
# })

}

shinyApp(ui, server)

最佳答案

你就快到了。你要做的,就是听input$map_onclick响应式(Reactive),除了其他信息之外,它还返回一个包含相关信息的对象槽。一旦您单击任何条形图,就会生成该对象,这是响应式(Reactive)的结构:

List of 1
 $ map_onclick:List of 3
  ..$ lng   : num 3.4
  ..$ lat   : num 49.4
  ..$ object:List of 5
  .. ..$ area      : chr "B"
  .. ..$ count     : int 111
  .. ..$ median_lon: num 3.41
  .. ..$ median_lat: num 49.4
  .. ..$ color     : chr "#FF0080"

有了这条信息,调整您的代码就相当简单了(不过我从未使用过deckgl,所以我只是使用了您的注释代码 - 如果需要的话进行调整)

observeEvent(input$map_onclick, {
        deckgl_proxy( 'map' ) %>%

          add_column_layer(
            data = orig_df %>% filter( area == input$map_onclick$object[["area"]] ),
            getPosition = ~lon + lat,
            getElevation = ~count,
            getFillColor = ~color,
            getTooltip = "Area: {{area}}, Count: {{count}}",
            elevationScale = 50
          ) %>% update_deckgl(it = "works")
   })

我想剩下要做的就是添加一些从详细 map 中获取的逻辑,但是您可以轻松地向数据添加一个标志,您可以从中得出您所在的层(聚合的或原始的)并基于运行不同的逻辑。

关于r - 单击栏时更新 R Shiny 的 Dececkgl map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62614164/

相关文章:

r - 在连续行中查找值

r - 绘图未使用模块和 tabPanels 在 Rshiny 中渲染

r - 如何在 R 中动态渲染按钮图标 Shiny

r - Shinydashboard 'topbar'

css - Shinydashboard 选项卡高度

r - 有没有办法区分包含和或乘积的函数?

r - 为什么在套索回归中计算 MSE 会给出不同的输出?

R:选择数据框中同时包含正值和负值的行

css - 定位 R Shiny 的 selectInput 小部件

r - 带有 Observes 和 reactiveValues 的 Shiny 模块