单击事件和渲染图之间的 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_)})
这应该很简单我以前已经解决过这个问题,但我记不得怎么做了。
基本上,在下面的代码中,在 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_)})