根据R Shiny

时间:2019-03-06 10:20:16

标签: r shiny

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

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

因此,理想情况下,下面的示例将在单击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)

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

只需将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)