繁体   English   中英

根据R Shiny中的点击输入更改图

[英]Change plot based on click input in R shiny

对于我的应用程序,我需要用户单击地块上的某个区域,然后该地块会对该点击做出响应,并显示链接到该输入点击的新地块。

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

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

链接示例

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)

此示例显示了一个主图,并且在单击主图时它显示了一个子图。 再次单击,将再次显示主图。

这个想法是,只要发生点击,计数器( 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)

只需将isolate放入renderPlot中:

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM