R Shiny Реактивный бесконечный цикл между событием клика и графиком рендеринга - PullRequest
0 голосов
/ 26 апреля 2018

Это должно быть очень просто, я исправил это раньше, но на всю жизнь не могу вспомнить, как.

В основном, в приведенном ниже коде есть событие щелчка на карте пластины, созданной в GGplot.

Событие click изменяет последний столбец в кадре необработанных данных (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)

1 Ответ

0 голосов
/ 26 апреля 2018

Я нашел проблему, необходимую для изоляции всей строки:

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

нравится:

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

...