Это должно быть очень просто, я исправил это раньше, но на всю жизнь не могу вспомнить, как.
В основном, в приведенном ниже коде есть событие щелчка на карте пластины, созданной в 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)