Почему я получаю только одну сплошную полосу, когда строю график ggplot2 в своем приложении r Shiny с использованием загруженных данных? - PullRequest
0 голосов
/ 25 декабря 2018

Я пытаюсь создать свое первое приложение Shiny.Я могу загрузить файл .csv с простым набором данных, который я создал, и очень хорошо отобразить таблицу на первой вкладке.Затем я пытаюсь использовать те же данные для создания гистограммы, используя ggplot2.За пределами Shiny, гистограмма генерирует отлично.НО внутри приложения он генерирует график с одним столбцом, а не столбцами, представляющими счетчик каждого типа «домашнее животное», как предполагается, просто столбец, представляющий счетчик всех строк (30).Я не уверен, почему он не будет учитывать каждый тип "питомца" в Shiny, пожалуйста, помогите?

Я пытался использовать is.character и is.factor

Столбец данных, который использует скрипт, состоит из 30 строк различных типов домашних животных (например, собака, кошка, птица, ящерица).Окончательный график должен быть гистограммой с подсчетом каждого типа этих питомцев.

library(shiny)
library(dplyr)
library(ggplot2)
library(readr)

МОЙ КОД UI:

ui <- fluidPage(

# App title ----
titlePanel("Magic Pets"),

# Sidebar layout with input and output definitions ----
sidebarLayout(

# Sidebar panel for inputs ----
sidebarPanel(

  # Input: Upload .csv 
  fileInput('file1', 'Choose .CSV File',
            accept=c('text/csv',
                     'text/comma-separated-values,text/plain',
                     '.csv')),


  selectInput("xcol", "Pets", "", selected = "")),


# Main panel for displaying outputs ----
mainPanel(

  # Output: Tabset for data table and plot
  tabsetPanel(type = "tabs",
              tabPanel("Pet Data", DT::dataTableOutput('contents')),
              tabPanel("Lucky Pet Plot", plotOutput("MyPlot"))

      )
     )
    )
   )

МОЙ КОД СЕРВЕРА:

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

output$MyPlot <- renderPlot({
z <- myData()[,input$xcol]

p <- ggplot(z, aes(x=input$xcol, fill = input$xcol)) + 
geom_bar(stat="count")
print(p)

})

myData <- reactive({
req(input$file1) # require that the input is available


df <- read_csv(input$file1$datapath) 


updateSelectInput(session,
                  inputId = "xcol", label = "Pets",
                  choices = names(df), selected = names(df)[sapply(df, 
is.character)])

return(df)
})


# Generate an HTML table view of the data ----

output$contents <- DT::renderDataTable({
DT::datatable(myData()) 
})
}

shinyApp(ui, server)

1 Ответ

0 голосов
/ 26 декабря 2018

Попробуйте:

library(shiny)
library(dplyr)
library(ggplot2)
library(readr)

ui <- fluidPage(

  # App title ----
  titlePanel("Magic Pets"),

  # Sidebar layout with input and output definitions ----
  sidebarLayout(

    # Sidebar panel for inputs ----
    sidebarPanel(

      # Input: Upload .csv 
      fileInput('file1', 'Choose .CSV File',
                accept=c('text/csv',
                         'text/comma-separated-values,text/plain',
                         '.csv')),


      selectInput(inputId = "xcol", label = "Pets", choices = "", selected = "")

      ),


    # Main panel for displaying outputs ----
    mainPanel(

      # Output: Tabset for data table and plot
      tabsetPanel(type = "tabs",
                  tabPanel("Pet Data", DT::dataTableOutput('contents')),
                  tabPanel("Lucky Pet Plot", plotOutput("MyPlot"))

      )
    )
  )
)

server <- function(input, output, session) {
  myData <- reactive({
    req(input$file1) # require that the input is available

    df <- read_csv(input$file1$datapath) 

    return(df)

  })

  observe({ # observe is similar to recative expect that it doesn't yield results
    updateSelectInput(session,
                      inputId = "xcol", 
                      label = "Pets",
                      choices = names(myData()),
                      selected = names(myData())[1] # select 1st column name
    )

  })

  output$MyPlot <- renderPlot({
    #z <- myData()[,input$xcol] #not needed

    p <- ggplot(myData(), aes_string(x=input$xcol, fill=input$xcol)) + 
      # aes_string allows you to use strings or quoted names/calls to define the aesthetic mappings
                  geom_bar(stat="count")

    print(p)

  })

  # Generate an HTML table view of the data ----

  output$contents <- DT::renderDataTable({
    DT::datatable(myData()) 
  })

}

shinyApp(ui, server)

Обратите внимание на две вещи:

  1. используйте observe (что аналогично reactive, но без результатов) дляобновите ввод

  2. , используйте aes_string вместо aes, чтобы разрешить использование строк или имен в кавычках для определения эстетических отображений.Обратите внимание, что input$xcol возвращает "pet", а не pet.

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