【问题标题】:Change plot based on click input in R shiny根据 R Shiny 中的点击输入更改绘图
【发布时间】:2019-07-27 23:25:52
【问题描述】:

对于我的应用程序,我需要用户单击绘图上的某个区域,然后绘图响应该单击并显示与该输入单击链接的新绘图。

但是,当前它正在运行,但新绘图仅显示 3 秒,然后返回到原始绘图。我发现了一个类似的例子here。该图基于反应值列表进行更新,然后绘制用户选择的那些新点。我想如果我找到一种方法来修改它以在单击事件之后立即绘制新图,它应该可以工作,但卡在这部分。

因此,理想情况下,以下示例将在单击后立即添加新点。在我的情况下,我需要显示新的绘图,直到单击绘图的新区域。

链接示例

library(shiny)

ui <- basicPage(
  plotOutput("plot1", click = "plot_click"),
  verbatimTextOutput("info"),
  actionButton("updateplot", "Update Plot:")
)

server <- function(input, output) {
  val <- reactiveValues(clickx = NULL, clicky = NULL)

  observe({
    input$plot_click
    isolate({
      val$clickx = c(val$clickx, input$plot_click$x)
      val$clicky = c(val$clicky, input$plot_click$y)     
    })
  }) #adding clicks to list

  output$plot1 <- renderPlot({
    plot(mtcars$wt, mtcars$mpg)
    input$updateplot
    isolate({
      points(val$clickx, val$clicky)
    })
  })

  output$info <- renderText({
    paste0("x = ", val$clickx, ", y = ",val$clicky, "\n")
  })

}

shinyApp(ui, server)

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    只需将isolate 放入您的渲染图中即可:

    library(shiny)
    
    ui <- basicPage(
      plotOutput("plot1", click = "plot_click"),
      verbatimTextOutput("info")
    )
    
    server <- function(input, output) {
      val <- reactiveValues(clickx = NULL, clicky = NULL)
    
      observe({
        input$plot_click
        isolate({
          val$clickx = c(val$clickx, input$plot_click$x)
          val$clicky = c(val$clicky, input$plot_click$y)     
        })
      }) #adding clicks to list
    
      output$plot1 <- renderPlot({
        plot(mtcars$wt, mtcars$mpg)
        points(val$clickx, val$clicky)
      })
    
      output$info <- renderText({
        paste0("x = ", val$clickx, ", y = ",val$clicky, "\n")
      })
    
    }
    
    shinyApp(ui, server)
    

    【讨论】:

      【解决方案2】:

      这个例子显示了一个主图,点击主图后,它显示了一个子图。再次单击它会再次显示主要情节。

      这个想法是,每当点击发生时,计数器 (trigger) 就会增加。在观察者中使用req(.) 很重要,以免释放鼠标按钮时观察者再次触发(在这种情况下,input$plot_click 设置为NULL)。

      renderPlot(.) 然后依赖于这个trigger 并显示主图或子图。

      更新。如果你想使用来自input$plot_click 对象的信息,你也应该保存它,以避免它得到NULL

      library(shiny)
      library(ggplot2)
      
      ui <- basicPage(
         plotOutput("plot1", click = "plot_click")
      )
      
      server <- function(input, output) {
         plot_data <- reactiveValues(trigger = 0, x = NA, y = NA)
      
         observe({
            req(input$plot_click)
            isolate(plot_data$trigger <- plot_data$trigger + 1)
            plot_data$x <- input$plot_click$x
            plot_data$y <- input$plot_click$y
          })
      
         output$plot1 <- renderPlot({
            if (plot_data$trigger %% 2 == 0) {
               plot(1:10, main = "Main Plot")
            } else {
               ggplot() + geom_point(aes(x = plot_data$x, y = plot_data$y), size = 5, shape = 19)
            }
         })
      }
      
      shinyApp(ui, server)
      

      【讨论】:

      • 这正是我正在寻找的,但只需要针对用户点击的位置进行调整。我尝试调整您的代码并用ggplot()+geom_point(aes(x=input$plot_click$x,y=input$plot_click$y),size=5,shape=19) 替换您提供的else 语句,但是在单击图表时,我收到以下错误: tibble 中的所有列必须是1d 或2d 对象:* 列x 为NULL, * 列y 为NULL
      • 当我在我的实际程序中调用它时,它会显示一秒钟的新图,然后是长度为零的参数错误。
      • 查看我的更新回复。基本上你应该存储点击事件的值,否则它们会在你释放鼠标的那一刻被NULL覆盖。
      • 太棒了。无论如何要避免双击?我想也许可以取出触发器,但我需要的原始情节没有出现。
      猜你喜欢
      • 2019-05-05
      • 2015-08-16
      • 1970-01-01
      • 2022-01-12
      • 2017-06-19
      • 2022-01-15
      • 2016-02-02
      • 2017-05-17
      • 1970-01-01
      相关资源
      最近更新 更多