R Shiny: прочитать файл данных, заставить пользователя выбрать переменную, построить график с помощью ggplot - PullRequest
0 голосов
/ 02 ноября 2018

Как указано в заголовке, я пытаюсь использовать Shiny в R для создания программы, которая читает CSV-файл, загруженный пользователем, после чего пользователь может выбрать переменную из этого файла для просмотра графика, который наносится на график. по ggplot. Я пытаюсь добиться этого на двух вкладках, первая вкладка будет читать файл, а вторая - пользователь сможет выбрать переменную для просмотра графика.

Мои коды указаны ниже. В настоящее время я могу успешно прочитать файл пользователя, но не могу построить график на основе выбранной переменной (в настоящее время у меня есть только 1 переменная «Location» для демонстрации). (HomeWTaxAmt - это переменная y для построения графика).

library(shiny)
library(ggplot2)
library(data.table)
library(RColorBrewer)
options(scipen=1000)

ui <- fluidPage(
  navbarPage("User Interface:",tabPanel("Upload",
  titlePanel("Uploading Files"),
  sidebarLayout(
    sidebarPanel(
      fileInput("file1", "Choose CSV File",
                multiple = TRUE,
                accept = c("text/csv",
                           "text/comma-separated-values,text/plain",
                           ".csv")),
      tags$hr(),
      checkboxInput("header", "Header", TRUE),
      radioButtons("sep", "Separator",
                   choices = c(Comma = ",",
                               Semicolon = ";",
                               Tab = "\t"),
                   selected = ","),
      tags$hr(),
      radioButtons("disp", "Display",
                   choices = c(Head = "head",
                               All = "all"),
                   selected = "head"),
      radioButtons("quote", "Quote",
                   choices = c(None = "",
                               "Double Quote" = '"',
                               "Single Quote" = "'"),
                   selected = '"')),
    mainPanel(
      verbatimTextOutput("summary"),
      tableOutput("contents")
    ))), 
  tabPanel("Graphing",
                 titlePanel("Plotting Graphs"),
                 sidebarLayout(
                   sidebarPanel(
                     selectInput("variable", "Variable:",
                                 list("Location"))),
                   mainPanel(
                     h3(textOutput("caption")),
                     plotOutput("ggplot")
                   )
  ))
))

server <- function(input, output) {
  output$contents <- renderTable({
    req(input$file1)
    library(data.table)
    data <- fread(input$file1$datapath,
                  header = input$header,
                  sep = input$sep,
                  quote = input$quote)

    if(input$disp == "head") {
      return(head(data))
    }
    else {
      return(data)
    }

  })
  output$summary <- renderPrint({
    summary(data)
  })

  formulaText <- reactive(function() {
    paste("HomeWTaxAmt ~", input$variable)
  })

  output$caption <- renderText(function() {
    formulaText()
  })

  output$ggplot <- renderPlot(function() {
    data <- fread(input$file1$datapath,
                  header = input$header,
                  sep = input$sep,
                  quote = input$quote)
    if(is.null(data)) return(NULL)
    # check for the input variable
    ggplot(data, aes(x=reorder(factor(data[input$variable]), -abs(HomeWTaxAmt), function(x){sum(x)}), 
                     weight = abs(HomeWTaxAmt), fill = factor(data[input$variable]))) + geom_bar(show.legend=FALSE) + xlab(input$variable) + 
            scale_fill_manual(values=brewer.pal(n = 12, name = "Paired"))
  })
}

shinyApp(ui, server)

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Немного изменил ваш код, и я надеюсь, что он вам поможет.

library(shiny)
library(ggplot2)

ui <- fluidPage(
  navbarPage("User Interface:",tabPanel("Upload",
                                        titlePanel("Uploading Files"),
                                        sidebarLayout(
                                          sidebarPanel(
                                            fileInput("file1", "Choose CSV File",
                                                      multiple = TRUE,
                                                      accept = c("text/csv",
                                                                 "text/comma-separated-values,text/plain",
                                                                 ".csv")),
                                            tags$hr(),
                                            checkboxInput("header", "Header", TRUE),
                                            radioButtons("sep", "Separator",
                                                         choices = c(Comma = ",",
                                                                     Semicolon = ";",
                                                                     Tab = "\t"),
                                                         selected = ","),
                                            tags$hr(),
                                            radioButtons("disp", "Display",
                                                         choices = c(Head = "head",
                                                                     All = "all"),
                                                         selected = "head"),
                                            radioButtons("quote", "Quote",
                                                         choices = c(None = "",
                                                                     "Double Quote" = '"',
                                                                     "Single Quote" = "'"),
                                                         selected = '"')),
                                          mainPanel(
                                            verbatimTextOutput("summary"),
                                            tableOutput("contents")
                                          ))), 
             tabPanel("Graphing",
                      titlePanel("Plotting Graphs"),
                      sidebarLayout(
                        sidebarPanel( uiOutput("variable_x"),
                                      uiOutput("variable_y")),
                        mainPanel(
                          h3(textOutput("caption")),
                          plotOutput("plot")
                        )
                      ))
  ))

server <- function(input, output, session) {
  onSessionEnded(stopApp)
  data <- reactive({
    req(input$file1)
    df <- read.csv(input$file1$datapath, header = input$header, sep = input$sep, quote = input$quote)
    return(df)
  })

  output$contents <- renderTable({
    if (input$disp == "head") {
      return(head(data()))
    }
    else {
      return(data())
    }
  })
  output$summary <- renderPrint({
    summary(data())
  })

  output$variable_x <- renderUI({
    selectInput("variableNames_x", label = "Variable_X", choices = names(data()))  
  })
  output$variable_y <- renderUI({
    selectInput("variableNames_y", label = "Variable_Y", choices = names(data()) ) 
  })
  dat <- reactive({
    test <- data.frame(data()[[input$variableNames_x]], data()[[input$variableNames_y]])
    colnames(test) <- c("X", "Y")
    return(test)
  })

  output$plot <- renderPlot({
    if (is.null(data)) { return(NULL)
    } else {
      ggplot(dat(),aes(x = X,y = Y)) + geom_point(colour = 'red',height = 400,width = 600) +
        labs(y = input$variableNames_y,
             x = input$variableNames_x,
             title = "ggplot")
    }
  })
}

shinyApp(ui, server)

Примечание: я изменил вашу ggplot функцию, но вы можете изменить ее согласно вашему требованию.

0 голосов
/ 02 ноября 2018

Поскольку у меня не было доступа к вашим точным файлам .csv, мне пришлось внести некоторые коррективы в команду построения, но я почти уверен, что вы можете перейти оттуда и заставить ее работать с вашими данными. Обратите внимание, что отсутствие загрузки файла .csv теперь приводит к ошибкам на первой вкладке, которые исчезают при загрузке данных. Возможно, вы захотите использовать некоторые переключатели ifelse, чтобы конечный пользователь не видел эти R-ошибки.

Вот код, который строит график, как и предполагалось, на основе некоторых образцов данных, которые у меня были:

library(shiny)
library(ggplot2)
library(data.table)
library(RColorBrewer)
options(scipen=1000)

#XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
# I didn't change anything in this section
ui <- fluidPage(
  navbarPage("User Interface:",tabPanel("Upload",
                                        titlePanel("Uploading Files"),
                                        sidebarLayout(
                                          sidebarPanel(
                                            fileInput("file1", "Choose CSV File",
                                                      multiple = TRUE,
                                                      accept = c("text/csv",
                                                                 "text/comma-separated-values,text/plain",
                                                                 ".csv")),
                                            tags$hr(),
                                            checkboxInput("header", "Header", TRUE),
                                            radioButtons("sep", "Separator",
                                                         choices = c(Comma = ",",
                                                                     Semicolon = ";",
                                                                     Tab = "\t"),
                                                         selected = ","),
                                            tags$hr(),
                                            radioButtons("disp", "Display",
                                                         choices = c(Head = "head",
                                                                     All = "all"),
                                                         selected = "head"),
                                            radioButtons("quote", "Quote",
                                                         choices = c(None = "",
                                                                     "Double Quote" = '"',
                                                                     "Single Quote" = "'"),
                                                         selected = '"')),
                                          mainPanel(
                                            verbatimTextOutput("summary"),
                                            tableOutput("contents")
                                          ))), 
             tabPanel("Graphing",
                      titlePanel("Plotting Graphs"),
                      sidebarLayout(
                        sidebarPanel(
                          selectInput("variable", "Variable:",
                                      list("Location"))),
                        mainPanel(
                          h3(textOutput("caption")),
                          plotOutput("ggplot")
                        )
                      ))
  ))
#XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX


server <- function(input, output, session) {  # make sure to include "session" here, in order to update your inputs later
  # create an reactive upload to access your data more quickly and easily
  reactive_data <- reactive({
    print(input$file1$datapath)
    data <- fread(input$file1$datapath,
                  header = input$header,
                  sep = input$sep,
                  quote = input$quote)
    return(data)
  })

  # preview
  # no library(data.table) required here, as its already loaded at the beginning of the script)
  output$contents <- renderTable({
    # load your data
    data <- reactive_data()

    if(input$disp == "head") {
      return(head(data))
    }
    else {
      return(data)
    }

  })
  output$summary <- renderPrint({
    summary(reactive_data())
  })

  formulaText <- reactive({ # no need for function() here
    paste("HomeWTaxAmt ~", input$variable)
  })

  output$caption <- renderText({
    formulaText()
  })

  output$ggplot <- renderPlot({

    # load your data
    data <- reactive_data()

    # to only plot when data is not NULL, make sure to include the plotting command in the if-else statement
    # no data
    if(is.null(data)){
      return(NULL)

    }else{
    # data

      # update your selectInput first, so that all the variables match your .csv headers
      updateSelectInput(session, "variable",
                        choices = colnames(data),
                        selected = input$variable) # this keeps the input on the last thing selected on tab-change

      # check for the input variable
      # I used aes_string here so that indexing the colnames works
      # you'll have to adjust the plotting command to your needs as my .csv files aren't the same as yours
      plot <- ggplot(data, aes_string(x=colnames(data)[colnames(data) == input$variable], colnames(data)[length(colnames(data))]))+
        geom_bar(stat="identity")

      # Display your plot
      print(plot)

    }

  })
}

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