【问题标题】:avoid double refresh of plot in shiny避免在闪亮的情况下双重刷新情节
【发布时间】:2015-09-08 14:38:18
【问题描述】:

在一个闪亮的图中,我试图突出显示与点击点匹配的点(基于 nearPoints() 并点击)。

它有点工作。然而,闪亮的应用程序的反应部分被刷新了两次,第二次迭代似乎清除了点击的信息。

如何避免应用二次刷新?

这是 MWE:

library("Cairo")
library("ggplot2")
library("shiny")

ui <- fluidPage(
  fluidRow(
    titlePanel('Phenotype Plots')
  ),

  fluidRow(
    uiOutput("plotui")
  ),

  hr(),

  fluidRow(

    wellPanel(
      h4("Selected"),
      tableOutput("info_clicked")
      ##dataTableOutput("info_clicked") ## overkill here
    )
  )
)


server <- function(input, output, session) {

  selected_line <-  reactive({
    nearPoints(mtcars, input$plot_click,
               maxpoints = 1,
               addDist = TRUE)
  })

  output$plotui <- renderUI({
      plotOutput("plot", height=600,
        click = "plot_click"
      )
    })

  output$plot <- renderPlot({

    p <- ggplot(mtcars) +
      facet_grid(am ~ cyl) +
      theme_bw() +
      geom_point(aes(x=wt, y=mpg))

    sline <- selected_line()
    if (nrow(sline) > 0) {
      p <- p +
        geom_point(aes(x=wt, y=mpg),
                   data=mtcars[mtcars$gear == sline$gear,],
                   colour="darkred",
                   size=1)
    }

    p

  })

  ##output$info_clicked <- renderDataTable({
  output$info_clicked <- renderTable({
    res <- selected_line()
    ## datatable(res)
    res
  })

}

shinyApp(ui, server)

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    最后(!) 找到了避免在 Shiny 中单击时重复刷新的解决方法:使用 observeEvent() 捕获对 reactiveValue() 的单击。似乎适用于我的项目,也适用于您的 MWE。请参阅下面的更新代码部分。

    library("Cairo")
    library("ggplot2")
    library("shiny")
    
    ui <- fluidPage(
      fluidRow(
        titlePanel('Phenotype Plots')
      ),
    
      fluidRow(
        uiOutput("plotui")
      ),
    
      hr(),
    
      fluidRow(
    
        wellPanel(
          h4("Selected"),
          tableOutput("info_clicked")
          ##dataTableOutput("info_clicked") ## overkill here
        )
      )
    )
    
    
    server <- function(input, output, session) {
    
      ## CHANGE HERE
      ## Set up buffert, to keep the click.  
      click_saved <- reactiveValues(singleclick = NULL)
    
      ## CHANGE HERE
      ## Save the click, once it occurs.
      observeEvent(eventExpr = input$plot_click, handlerExpr = { click_saved$singleclick <- input$plot_click })
    
    
      ## CHANGE HERE  
      selected_line <-  reactive({
        nearPoints(mtcars, click_saved$singleclick, ## changed from "input$plot_click" to saved click.
                   maxpoints = 1,
                   addDist = TRUE)
      })
    
      output$plotui <- renderUI({
        plotOutput("plot", height=600,
                   click = "plot_click"
        )
      })
    
      output$plot <- renderPlot({
    
        p <- ggplot(mtcars) +
          facet_grid(am ~ cyl) +
          theme_bw() +
          geom_point(aes(x=wt, y=mpg))
    
        sline <- selected_line()
        if (nrow(sline) > 0) {
          p <- p +
            geom_point(aes(x=wt, y=mpg),
                       data=mtcars[mtcars$gear == sline$gear,],
                       colour="darkred",
                       size=1)
        }
    
        p
    
      })
    
      ##output$info_clicked <- renderDataTable({
      output$info_clicked <- renderTable({
        res <- selected_line()
        ## datatable(res)
        res
      })
    
    }
    
    shinyApp(ui, server)
    

    【讨论】:

    • 非常感谢。像魅力一样工作——即使在我的“真实”应用程序中也是如此。
    • 老兄。这个问题已经阻止了我 3 天!感谢您发布的解决方案。我仍然不是 100% 确定它为什么会起作用(有人有解释吗?)......但它确实如此。 +1
    猜你喜欢
    • 2020-10-13
    • 2014-02-18
    • 1970-01-01
    • 2017-11-07
    • 2021-05-10
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多