【问题标题】:Showing plot using observeEvent in Shiny app在 Shiny 应用程序中使用 observeEvent 显示绘图
【发布时间】:2021-03-13 21:30:06
【问题描述】:

我在闪亮的应用程序中使用传单,我希望应用程序在用户单击地图后打开一个窗口,其中包含一个绘图。我写了以下代码:

library(shiny)
library(leaflet)
library(plotly)
library(dplyr)

ui <- fluidPage(
  
  leafletOutput("mymap"),


)

server <- function(input, output, session) {
  
  points <- eventReactive(input$recalc, {
    cbind(rnorm(40) * 2 + 13, rnorm(40) + 48)
  }, ignoreNULL = FALSE)
  
  output$mymap <- renderLeaflet({
    leaflet() %>%
      addProviderTiles(providers$Stamen.TonerLite,
                       options = providerTileOptions(noWrap = TRUE)
      ) %>%
      addMarkers(data = points())
  })
  
  
  
  observeEvent(input$mymap_marker_click,{
    
    df <- data.frame(x = 1:10, y = 1:10)
    plt <- ggplot(df, aes(x,y)) + geom_line()
    pltly <- ggplotly(plt)
    
    
    showModal(modalDialog(
      title = "Important message", size = "l",
      pltly ))
  })
  
}

shinyApp(ui, server)

这种代码可以完成这项工作,但它显示的情节非常压缩!如果您将窗口的边界稍微向左或向右拖动,那么它将被修复,但我希望它可以正常工作,而无需这样做来修复情节!有谁知道更好的方法吗?

【问题讨论】:

    标签: r shiny leaflet interactive


    【解决方案1】:

    您可以使用renderPlotlyplotlyOutput 来制作和显示绘图。

      output$my_plotly <- renderPlotly({
          df <- data.frame(x = 1:10, y = 1:10)
          plt <- ggplot(df, aes(x,y)) + geom_line()
          ggplotly(plt)
        })
    
      observeEvent(input$mymap_marker_click,{
        showModal(modalDialog(plotlyOutput("my_plotly")))
        })
    

    【讨论】:

    • 上述解决方案有效,但存在问题。在我的真实示例中,该图使用来自地图中点击的信息,例如要创建的 (input$mymap_marker_click$id),因此我必须在“renderPlotly”之前使用另一个“observeEvent”来获取 id 然后生成相应的情节。这种方法的问题在于,当您单击不同位置时,第二个“observeEvent”运行得更快并显示前一个区域的图,直到第一个“observeEvent + rednerPlotly”完成运行并生成新图,然后才出现模态自行更新。
    • 随时发布与该问题相关的新问题
    猜你喜欢
    • 2023-01-26
    • 2016-02-23
    • 1970-01-01
    • 2021-05-26
    • 2020-06-11
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    相关资源
    最近更新 更多