R Shiny 中的列名反应性问题

Problem with column name reactivity in Rshiny

我正在开发一个 Rshiny 仪表板,它允许上传一个 csv 文件用于热图可视化。该文件的第一列名称为 COL1,其他列是允许用户从中访问的 ID 名称 select。服务器部分中的一些代码使用 R table() 从文件中汇总两列,如下所示: table(COL1, selected column) to arrive at nrow(30) by cols (4).然后这个矩阵被热图函数使用。我可以看到热图输出和 selecting 不同的 ID,但是,不会更改热图模式以反映每个 selected ID 的不同数据。每次我 select 一个不同的 ID,我都会得到相同的热图。我猜,ID selection 没有按预期更新。任何对此问题的解决方案将不胜感激。

代码:

ui <- fluidPage(
  titlePanel("plot"),
  sidebarLayout(
    sidebarPanel("Sidebar panel",
                 # Input: Selector for choosing dataset ----
                 fileInput("file1", "Add File",
                           accept = c(
                             "text/csv",
                             "text/comma-separated-values,text/plain",
                              ".csv")
                 ),
                 tags$hr(),
                 checkboxInput("header", "Header", TRUE),
                 selectInput("IDs", "Add ID:", choices=c())
                 # actionButton('getHmap', 'get heatmap')
    ),
    mainPanel("Plot",
              #column(6, 
              plotOutput("themap"),
              #tableOutput("table.output")
    )
  )
)

server = function(input, output, session) {

  data1 <- reactive({
    validate(need(input$file1,""))
    inFile <- input$file1
    if (is.null(inFile))
      return(NULL)
    tbl <- read.csv(inFile$datapath)
    return(tbl)    
  })


  plotdata <- reactive({
   data2 <- data1()

     updateSelectInput(session,"IDs",choices=colnames(data2[,-1])) 

    data3 <- table(data2$COL1,data2[,input$sampleIDs])
    data3  <- as.data.frame.matrix(data3)
    data3  <- data3[c(2,1,4,3)]
    data4 <- data3
    data4$COL2 <- rownames(data3)
    data4 <- data4[, c(5,1:4)]
    data5 <- data4[,-1]
    data.df <- as.matrix(data5)

    return(data.df)    
  })

  output$themap = renderPlot({

    pheatmap(plotdata())
  })
}

shinyApp(ui, server)

尝试以这种方式更改您的服务器功能:

server = function(input, output, session) {

  data1 <- reactive({
    validate(need(input$file1,""))
    inFile <- input$file1
    if (is.null(inFile))
      return(NULL)
    tbl <- read.csv(inFile$datapath)
    updateSelectInput(session,"IDs",choices=colnames(tbl[,-1])) 
    return(tbl)    
  })


  plotdata <- reactive({
    data2 <- data1()    
    data3 <- table(data2$COL1,data2[,input$sampleIDs])
    data3  <- as.data.frame.matrix(data3)
    data3  <- data3[c(2,1,4,3)]
    data4 <- data3
    data4$COL2 <- rownames(data3)
    data4 <- data4[, c(5,1:4)]
    data5 <- data4[,-1]
    data.df <- as.matrix(data5)

    return(data.df)    
  })

  output$themap = renderPlot({
    pheatmap(plotdata())
  })
}