单击事件和渲染图之间的 R Shiny Reactive 无限循环

R Shiny Reactive infinite loop between click event and render plot

这应该很简单我以前已经解决过这个问题,但我记不得怎么做了。

基本上,在下面的代码中,在 GGplot 中生成的板图上有一个点击事件。

点击事件修改原始数据数据框 (keepRows) 中的最后一列。 这将再次调用 output$PlateMap <- renderPlot({...}) 函数来更新绘图(将更改绘图的代码尚不存在)

我遇到的问题是,当 output$PlateMap <- renderPlot({...}) 运行时,它会导致反应性事件再次调用 observe({...}) 事件,从而导致无限循环。

library(shiny)
library(CoreAPIV2)
library(platetools)
library(ggplot2)
library(viridis)

ui <- fluidPage(

  textInput(inputId = "Expbrcode", "Experiment Barcode"),
  plotOutput("PlateMap", click = "PlateMap_click"),
  tableOutput("RawData")
)

server <- function(input, output, session) {
  browser()
  verbose <- FALSE
  api <- CoreAPIV2::coreAPI("template.json")
  con<- CoreAPIV2::authBasic(api,useVerbose=verbose)
  rv <- reactiveValues()

  output$RawData <- renderTable({
    req(input$Expbrcode)
    browser()

    barcode <- input$Expbrcode
    container <- getExperimentContainers(api, "BIOCHEMICAL DOSE RESPONSE EXPERIMENT", barcode)
    RawData <- getExperimentSamplesRawData(api, container$entity, useVerbose = TRUE)$entity
    platemat <- plate_map(as.numeric(levels(RawData$DATA_VALUE))[RawData$DATA_VALUE],num_to_well(c(RawData$CI_CELL)))

    rv$RawData <- cbind(RawData, platemat, 'keepRows' = TRUE)
    })

  output$PlateMap <- renderPlot({
    req(rv$RawData)
    browser()

    ggplot(data = rv$RawData, aes_string(x = "Column", y = "Row")) +
      geom_point(data = expand.grid(seq(1, 12), seq(1, 8)),
                 aes_string(x = "Var1", y = "Var2"),
                 color = "grey90", fill = "white", shape = 21, size = 6, alpha = 0.1) +
      geom_point(aes_string(fill = "values"), colour = "gray20", shape = 21, size = 10) +
      coord_fixed(ratio = (13 / 12) / (9 / 8), xlim = c(0.5, 12.5), ylim = c(0.5, 8.5)) +
      scale_y_reverse(breaks = seq(1, 8), labels = LETTERS[1:8]) +
      scale_x_continuous(breaks = seq(1, 12)) +
      xlab("") +
      ylab("") +

    ggtitle("96-well plate Raw Data") +
    theme_grey() +
    scale_fill_viridis()

  })

  observe({
    req(input$PlateMap_click)
    browser()
    res <- nearPoints(isolate({rv$RawData}), isolate({input$PlateMap_click}), allRows = TRUE)
    rv$RawData$keepRows <- xor(isolate({rv$RawData$keepRows}), res$selected_)
  })

}

shinyApp(ui, server)

我发现了隔离整行所需的问题:

rv$RawData$keepRows <- xor(isolate({rv$RawData$keepRows}), res$selected_).

赞:

isolate({rv$RawData$keepRows <- xor(rv$RawData$keepRows, res$selected_)})