【问题标题】:Click Interactive Plot in R Shiny单击 R Shiny 中的交互式绘图
【发布时间】:2020-12-26 21:04:04
【问题描述】:

我正在尝试用一堆框创建一个图,然后当一个框被点击时,它会被着色。我有两个问题。 1.我想不出一种方法让我点击时动态更新图形。 2. 我不知道如何存储来自 click 输入变量的值,以便我存储所有以前的点击并能够在多个框中着色。您可以看到我尝试解决和测试这两个问题中的任何一个的几种方法,但我没有任何运气。对于这两个问题的任何帮助将不胜感激。

ui <- fluidPage(
   
   # Application title
   titlePanel("Boxes"),
   
   sidebarLayout(
      sidebarPanel(
         textOutput("text")),
      
      # Get it it's a pun
      mainPanel(
         plotOutput("boxPlot",click = "test")
      )
   )
)

# Define server logic required to draw a histogram
server <- function(input, output) {
  
  vals <- reactiveValues(x=NA,y=NA,test=NA)
  observeEvent(input$click, {
    vals$x <- c(vals$x,input$test$x)
    vals$y <- c(vals$y,input$test$y)
    vals$test <- input$test$x
  })
  
  output$boxPlot <- renderPlot({
    
    par(mai=c(0,0,0,0))
    plot(1,ylim=c(2,15),xlim=c(2,15),type='n',yaxs='i',xaxs='i',ylab='',xlab='',axes=F)
    for (i in 2:15) {
      abline(v=i)
      abline(h=i)
    }
    observeEvent(input$click, {      rect(floor(input$test$x),floor(input$test$y),ceiling(input$test$x),ceiling(input$test$y),col='blue')})
    # if (length(vals$x) > 0) {
      # rect(floor(vals$x[1]),floor(vals$y[1]),ceiling(vals$x[1]),ceiling(vals$y[1]),col='blue')
    # }
  })
  # output$text <- renderText(vals$x[length(vals$x)])
  output$text <- renderText(vals$test)
  
}
# Run the application 
shinyApp(ui = ui, server = server)

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    这可能是一个简单的解决方案。

    您的点击事件应该只有一个observeEvent。在 observeEvent 中,将您的 x 和 y 值存储为 reactiveValues,就像您当前所做的那样。

    然后,您的renderPlot 应该根据您的reactiveValues 绘制网格线并填充矩形。通过在renderPlot 中包含input$boxPlot_click(我称之为),每次点击都会重绘该图。

    library(shiny)
    
    ui <- fluidPage(
      titlePanel("Boxes"),
      sidebarLayout(
        sidebarPanel(
          textOutput("text")),
        mainPanel(
          plotOutput("boxPlot", click = "boxPlot_click")
        )
      )
    )
    
    server <- function(input, output) {
      
      vals <- reactiveValues(x=NA,y=NA)
      
      observeEvent(input$boxPlot_click, {
        vals$x <- c(vals$x,input$boxPlot_click$x)
        vals$y <- c(vals$y,input$boxPlot_click$y)
      })
      
      output$boxPlot <- renderPlot({
        input$boxPlot_click
        par(mai=c(0,0,0,0))
        plot(1,ylim=c(2,15),xlim=c(2,15),type='n',yaxs='i',xaxs='i',ylab='',xlab='',axes=F)
        for (i in 2:15) {
          abline(v=i)
          abline(h=i)
        }
        for (i in seq_along(length(vals$x))) {
          rect(floor(vals$x),floor(vals$y),ceiling(vals$x),ceiling(vals$y),col='blue')
        }
      })
      
      output$text <- renderText(paste0(vals$x, ', ' , vals$y, '\n'))
      
    }
    
    shinyApp(ui = ui, server = server)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-18
      • 2021-06-16
      • 2014-03-27
      • 2023-03-15
      • 2016-07-12
      • 1970-01-01
      • 2017-08-02
      • 2019-05-20
      相关资源
      最近更新 更多