尝试制作具有这些属性的 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/