R 同时更新中的绘图和多个表

R 同时更新中的绘图和多个表,r,shiny,R,Shiny,在我闪亮的应用程序中,我有一个ggplot火山图,它是可点击的,此外,我有一个表(表1)中的图中找到的所有数据,以及一个表(表2),用于点图中点击的数据点以及第一个表(表1)中点击的数据。 我想要的是在单击一个对象时更新其余两个对象。因此,如果单击绘图,数据点应在表2中弹出,我想将此信息添加到表1中(使行处于选中状态)。类似地,如果在表1中单击一行,我希望将其添加到表2和绘图中。如果在绘图或其他任何地方取消选择了一个点,则应从其余两个点中删除该点。 简而言之,如果从这三个对象中的任何一个选择或删

在我闪亮的应用程序中,我有一个ggplot火山图,它是可点击的,此外,我有一个表(表1)中的图中找到的所有数据,以及一个表(表2),用于点图中点击的数据点以及第一个表(表1)中点击的数据。 我想要的是在单击一个对象时更新其余两个对象。因此,如果单击绘图,数据点应在表2中弹出,我想将此信息添加到表1中(使行处于选中状态)。类似地,如果在表1中单击一行,我希望将其添加到表2和绘图中。如果在绘图或其他任何地方取消选择了一个点,则应从其余两个点中删除该点。 简而言之,如果从这三个对象中的任何一个选择或删除数据,我希望其他两个对象也会发生同样的情况。 希望这有意义,以下是我目前使用的代码:


ui <- fluidPage(
  
  fluidRow(
    column(
      width = 6,
      selectInput('inputFile', 
                  label='select a file:',
                  choice=c('C34_vs_wt','C32_vs_wt',
                           'C55_vs_wt','C49_vs_wt',
                           'C7_vs_wt','C9_vs_wt')),
      plotOutput("volcanoPlot", 
                 click = "volcanoPlotSelection", 
                 height = "700px")
    ),
    column(
      width = 6,
      dataTableOutput("selectedProbesTable"),
      hr(),
      dataTableOutput("mytable")
    )
  )
)


selected_points<-deseqres_DE[[1]][0,]
server <- function(input, output) {
  
  mc <- reactive({
    deseqres_DE[[which(names(deseqres_DE)==input$inputFile)]][,c(8,3,7,9)]
  })
  
  output$mytable <- renderDataTable({  #table with all data found in the plot
    datatable(mc()[,1:3], filter = 'top')
  })
  
  selected <- reactive({
    # add clicked
    selected_points <<- rbind(selected_points, 
                              nearPoints(mc(), 
                                         input$volcanoPlotSelection,
                                         maxpoints = 1),
                              mc()[input$mytable_rows_selected,])
    # remove _all_ duplicates if any (toggle mode) 
    selected_points <<- 
      selected_points[!(duplicated(selected_points) | 
                          duplicated(selected_points, fromLast = TRUE)), ]
    str(selected_points)
    return(selected_points)
  })

  output$volcanoPlot <- renderPlot({ #plot
    DE <- factor(ifelse(mc()$minusLog10Pvalue > 2 & (mc()$log2FoldChange > 2 | mc()$log2FoldChange < (-2)), 
                                "DEG", "non_DEG"))
    levels(DE) <- c(levels(DE), "clicked")
    DE[mc()$external_gene_name %in% selected()$external_gene_name] <- "clicked"
    
    ggplot() + 
      geom_point(
        data=mc()[which(DE=="non_DEG"),],
        aes(x=log2FoldChange, y=minusLog10Pvalue), 
        colour="#00BFC4") +
      geom_point(
        data=mc()[which(DE=="DEG"),],
        aes(x=log2FoldChange, y=minusLog10Pvalue), 
        colour="#F8766D") +
      geom_point(
        data=mc()[which(DE=="clicked"),],
       aes(x=log2FoldChange, 
            y=-log10(padj)), 
        colour="black") +

      geom_text(aes(x=mc()[which(DE=="clicked"),]$log2FoldChange,
                    y=mc()[which(DE=="clicked"),]$minusLog10Pvalue,
                    label = mc()[which(DE=="clicked"),]$external_gene_name),
                nudge_y = 5) +
      
      ggtitle(gsub("_vs_", " vs ", as.character(input$inputFile))) +
      xlab("log2 fold change") +
      ylab("-log10 adjusted p-value") +
      theme(legend.position = "none",
            plot.title = element_text(size = rel(1.5), hjust = 0.5),
            axis.title = element_text(size = rel(1.25))) 
    
  })
  
  output$selectedProbesTable <- renderDataTable( # table that shows clicked data
    selected()
  )
  
}

shinyApp(ui, server, options = list(height = 600))


用户界面