Как установить переменную x по умолчанию при загрузке файла .CSV в мое приложение? - PullRequest
1 голос
/ 04 ноября 2019

Цель моего приложения Shiny Application - загрузить файл .csv и построить график ggplot с его данными. Когда я загружаю файл .csv в Shiny Application, переменная по умолчанию - «y» для обеих входных переменных. Однако, когда я изменяю «y» на «x» на входе «X Variable», приложение работает нормально. Мне просто нужно установить «x» для ввода «X Variable» и «y» для ввода «Y Variable» по умолчанию при загрузке файла .csv.

Ниже приведен код app.R с моими комментариямии сообщение об ошибке, которое я получаю при загрузке файла.

library(shiny)
library(datasets)
library(ggplot2)

ui <- shinyUI(fluidPage(
  titlePanel("Column Plot"),
  tabsetPanel(
    tabPanel("Upload File",
             titlePanel("Uploading Files"),
             sidebarLayout(
               sidebarPanel(
                 fileInput('file1', 'Choose CSV File',
                           accept=c('text/csv', 
                                    'text/comma-separated-values,text/plain', 
                                    '.csv')),

                 tags$br(),
                 checkboxInput('header', 'Header', TRUE),
                 radioButtons('sep', 'Separator',
                              c(Comma=',',
                                Semicolon=';',
                                Tab='\t'),
                              ','),

                 selectInput('xcol', 'X Variable', "", selected = NULL),
                 selectInput('ycol', 'Y Variable', "", selected = NULL)

               ),
               mainPanel(
                 tableOutput('contents'),
                 plotOutput('MyPlot')
               )
             )
    )
  )
)
)


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

  data <- reactive({ 
    req(input$file1)

    inFile <- input$file1 

    df <- read.csv(inFile$datapath, header = input$header, sep = input$sep)

    ## Update inputs
    ## I've already tried to change the selected = names(df) to selected = NULL on this part of the server code, but it didn't work.

    updateSelectInput(session, inputId = 'xcol', label = 'X Variable',
                      choices = names(df), selected = names(df))
    updateSelectInput(session, inputId = 'ycol', label = 'Y Variable',
                      choices = names(df), selected = names(df)[2])

    return(df)
  })

  output$contents <- renderTable({
    data()
  })

  output$MyPlot <- renderPlot({

    xy <- data()[, c(input$xcol, input$ycol)]
    ggplot(data = xy, aes(x, y)) +
      geom_line() +
      geom_point()

  })
})

shinyApp(ui, server)

Сообщение об ошибке, которое я получаю:

«Ошибка: объект« x »не найден».

1 Ответ

1 голос
/ 04 ноября 2019

и добро пожаловать в SO ?

Ваша проблема здесь в том, что вы обновляете selectInput() в неправильное время: обновление выполняется после того, как сервер завершил вычисления, поэтому здесь, когда data() сделаноБег.

Таким образом, чтобы быть ясным, вы обновляете свой ввод после , пытаясь выбрать из него.

Другое дело, что вам нужно sym() & !! input$, чтобы он работал с ggplot() (см., Например: https://github.com/ColinFay/tidytuesday201942/blob/master/R/mod_dataviz.R#L184)

Вот рабочая версия:

library(shiny)
library(datasets)
library(ggplot2)
library(rlang)

ui <- shinyUI(fluidPage(
  titlePanel("Column Plot"),
  tabsetPanel(
    tabPanel("Upload File",
             titlePanel("Uploading Files"),
             sidebarLayout(
               sidebarPanel(
                 fileInput('file1', 'Choose CSV File',
                           accept=c('text/csv', 
                                    'text/comma-separated-values,text/plain', 
                                    '.csv')),

                 tags$br(),
                 checkboxInput('header', 'Header', TRUE),
                 radioButtons('sep', 'Separator',
                              c(Comma=',',
                                Semicolon=';',
                                Tab='\t'),
                              ','),

                 selectInput('xcol', 'X Variable', "", selected = NULL),
                 selectInput('ycol', 'Y Variable', "", selected = NULL)

               ),
               mainPanel(
                 tableOutput('contents'),
                 plotOutput('MyPlot')
               )
             )
    )
  )
)
)


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

  r <- reactiveValues(
    df = NULL
  )

  observe({
    req(input$file1$datapath)
    # req(input$xcol)
    # req(input$ycol)
    r$df <- read.csv(
      input$file1$datapath, 
      header = input$header, 
      sep = input$sep
    )
  })


  observeEvent( r$df   , {
    updateSelectInput(
      session, 
      inputId = 'xcol', 
      label = 'X Variable',
      choices = names(r$df), 
      selected = names(r$df)[1]
    )
    updateSelectInput(
      session, 
      inputId = 'ycol', 
      label = 'Y Variable',
      choices = names(r$df),
      selected = names(r$df)[2]
    )
  }, ignoreInit = TRUE)


  output$contents <- renderTable({
    req(r$df)
    head(r$df)
  })

  output$MyPlot <- renderPlot({
    req(r$df)
    req(input$xcol)
    req(input$ycol)
    ggplot(
      data = r$df, 
      aes(!!sym(input$xcol), !!sym(input$ycol))
    ) +
      geom_line() +
      geom_point()

  })
})

shinyApp(ui, server)

enter image description here

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