График данных после просмотра входных файлов с Shiny - PullRequest
0 голосов
/ 11 июля 2019

Я пытаюсь создать блестящее приложение, которое выполняет следующие действия:

1) Просмотр файла значений, который выглядит как

Sample x y
     A 1 3
     B 2 1
     C 3 6
     D 4 4

2) Просмотр второго информационного файла,

Sample Country Status
     A      US     OK
     B      UK     OK
     C      UK   NOPE
     D      US     OK

3) Когда я нажимаю кнопку Submit,

4) Я объединяю два файла по столбцу Sample,

5) Создайте точечный график с помощью ggplot с выпадающим меню, которое позволяет мне раскрасить точки в соответствии с именами столбцов из информационного файла.

С кодом, приведенным ниже, я сталкиваюсь с двумя проблемами: (i) после того, как я загружаю свои файлы и нажимаю кнопку Submit, ничего не происходит, и (ii) как я могу упомянуть в своем блоке selectInput мой выпадающий список в меню количество возможных choices (при условии, что я их заранее не знаю)?

library(shiny)
library(ggplot2)


ui <- fluidPage(

    sidebarLayout(
        sidebarPanel(
            fileInput(
                inputId = "user_value_file",
                label = "Choose a file with numeric values"
            ),
            fileInput(
                inputId = "user_info_file",
                label = "Choose a file with sample info"
            ),
            actionButton(
                inputId = "my_button",
                label = "Submit"
            )
        ),
        mainPanel(
            # browse sample annotation file
            selectInput(
                inputId = "info_col",
                label = "Choose an info to color",
                choices = c("Country", "Status")           # I am cheating here because I know in advance what are the colnames of the info file 
            ),
            # outputs
            plotOutput(
                outputId = "my_scatter_plot"
            )
        )
    )
)


server <- function(input, output) {

    output$contents <- renderTable(
        {
        valueFile <- input$user_value_file
        if (is.null(valueFile))
            return(NULL)

        infoFile <- input$user_info_file
        if (is.null(infoFile))
            return(NULL)

        }
    )

    randomVals <- eventReactive(
        input$goButton,
        {
        my_val <- read.table(valueFile$datapath, header = T, sep = "\t")        
        my_info <- read.table(infoFile$datapath, header = T, sep = "\t")
        df <- merge(my_val, my_info, by="Sample")

        output$my_scatter_plot <- renderPlot(
            {
            ggplot(df, aes_string(x=df$x, y=df$y, color=input$info_col)) + 
            geom_point()
            }
        )
        }
    )
}


shinyApp(ui = ui, server = server)

1 Ответ

0 голосов
/ 12 июля 2019

Несколько замечаний, чтобы заставить его работать:

  1. inputID в макете должен соответствовать параметрам сервера renderTable (например, input $ goButton должен быть введен $ my_button)
  2. renderPlot был перемещен из eventReactive и вызывает randomVals для получения фрейма данных. df
  3. Чтобы получить выбор из файла информации о пользователе, добавлен сеанс для функции сервера и updateSelectInput (обратите внимание, что в зависимости от структуры файла, которую вы, вероятно, хотите сделать)что-то вроде удаления имени первого столбца или других изменений)

В противном случае все остается как есть.Пожалуйста, дайте мне знать, если это поведение, которое вы искали.

library(shiny)
library(ggplot2)

ui <- fluidPage(

  sidebarLayout(
    sidebarPanel(
      fileInput(
        inputId = "user_value_file",
        label = "Choose a file with numeric values"
      ),
      fileInput(
        inputId = "user_info_file",
        label = "Choose a file with sample info"
      ),
      actionButton(
        inputId = "my_button",
        label = "Submit"
      )
    ),
    mainPanel(
      # browse sample annotation file
      selectInput(
        inputId = "info_col",
        label = "Choose an info to color",
        choices = NULL      # Get colnames from user_info_file later on    
      ),
      # outputs
      plotOutput(
        outputId = "my_scatter_plot"
      )
    )
  )
)

server <- function(input, output, session) {

  output$contents <- renderTable({
      valueFile <- input$user_value_file
      if (is.null(valueFile))
        return(NULL)

      infoFile <- input$user_info_file
      if (is.null(infoFile))
        return(NULL)
  })

  randomVals <- eventReactive(input$my_button, {
      my_val <- read.table(input$user_value_file$datapath, header = T, sep = "\t")        
      my_info <- read.table(input$user_info_file$datapath, header = T, sep = "\t")
      updateSelectInput(session, "info_col", "Choose an info to color", choices = names(my_info)[-1])
      merge(my_val, my_info, by="Sample")
  })
  output$my_scatter_plot <- renderPlot({
      df <- randomVals()
      ggplot(df, aes_string(x=df$x, y=df$y, color=input$info_col)) + 
        geom_point()
  })
}

shinyApp(ui, server)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...