有没有一种方法可以使用reactive data.frame、renderplot和observeEvent在一个shinny应用程序中toogle点

zhte4eai  于 2023-04-03  发布在  React
关注(0)|答案(1)|浏览(68)

在一个闪亮的应用程序中,我上传了一个数据集,它被设置为被动的(因为它可以被更新和替换),并使用ggplot2绘制了一个lm模型。
我只展示了一小部分代码,以使其简单。我明白问题是由于在observeEvent()中使用了reactive()函数。但我不知道如何解决这个问题。
这很好用。请参阅ui和server中的以下代码部分。

#in ui
fluidRow(column(2,numericInput("Xmin", "Xmin:", -0.2, step = 0.1)),
column(2,numericInput("Xmax", "Xmax:", 2, step = 0.1)),
column(2,numericInput("Ymin", "Ymin:", -0.2, step = 0.5)),
column(2,numericInput("Ymax", "Ymax:", 20, step = 0.5))),
plotOutput("plot_gam", click = "plot1_click",   brush = brushOpts(id = "plot1_brush")),
actionButton("exclude_toggle", "Toggle points"),
actionButton("exclude_reset", "Reset")
#in server
    #PLOT MODEL
    dg <- reactive({dat() %>% select(A,B)})
    vals <- reactive({reactiveValues(keeprows = rep(TRUE, nrow(dg())))})

    keep    <- reactive({dg()[ vals()$keeprows, , drop = FALSE]})
    exclude <- reactive({dg()[!vals()$keeprows, , drop = FALSE]})
  
    output$plot_gam <- renderPlot({
    ggplot(keep(), aes(A, B)) + 
    geom_point() +
    geom_smooth(method = lm, fullrange = TRUE, color = "red") +
    geom_point(data = exclude(), shape = 21, fill = NA, color = "black", alpha = 0.25) +
    coord_cartesian(xlim = c(input$Xmin, input$Xmax),   ylim = c(input$Ymin,input$Ymax))
    })

现在我希望能够切换点。

# Toggle points that are clicked
   observeEvent(input$plot1_click, 
   {req(vals())
   res <- nearPoints(dg(), input$plot1_click, allRows = TRUE)
   vals()$keeprows <- xor(vals()$keeprows, res$selected_)
    })

  # Toggle points that are brushed, when button is clicked
  observeEvent(input$exclude_toggle, {
  req(vals())
    res <- brushedPoints(dg(), input$plot1_brush, allRows = TRUE)
   vals()$keeprows <- xor(vals()$keeprows, res$selected_)
 })

  # Reset all points
  observeEvent(input$exclude_reset, {
  req(vals())
    vals()$keeprows <- rep(TRUE, nrow(dg()))
  })

不幸的是,应用程序崩溃,而我试图切换。我得到了以下消息
Warning: Error in <-: invalid (NULL) left side of assignment

wnavrhmk

wnavrhmk1#

根据@stefan在上面的评论中的回应,这里是解决方案:

vals <- reactiveValues(keeprows = NULL)
    observeEvent(dg(), {vals$keeprows <- rep(TRUE, nrow(dg()))})
    
    keep    <- reactive({dg()[ vals$keeprows, , drop = FALSE]})
    exclude <- reactive({dg()[!vals$keeprows, , drop = FALSE]})

相关问题