Проблема с реактивностью имени столбца в Ршинах - PullRequest
0 голосов
/ 26 мая 2020

Я разрабатываю панель управления Rshiny, которая позволяет загружать файл csv для визуализации тепловой карты. Файл имеет имя первого столбца как COL1, а другие столбцы - это имена идентификаторов, из которых пользователю разрешено выбирать. Некоторый код в разделе server использует R table () для суммирования двух столбцов из файла следующим образом: table (COL1, selected column), чтобы добраться до nrow (30) по cols (4). Затем эта матрица используется функцией тепловой карты. Я вижу вывод тепловой карты и выбор другого идентификатора, однако, не меняет шаблон тепловой карты, чтобы отражать разные данные для каждого выбранного идентификатора. Каждый раз, когда я выбираю другой идентификатор, я получаю одну и ту же тепловую карту. Я предполагаю, что выбор идентификатора не обновляется должным образом. Мы будем благодарны за любое решение этой проблемы.

Код:

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)

1 Ответ

1 голос
/ 27 мая 2020

Попробуйте изменить вашу функцию sertver таким образом:

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())
  })
}
...