Duzo12 / APPR-2018-19

Repozitorij z gradivi za predmet Analiza podatkov s programom R v študijskem letu 2018/19
MIT License
0 stars 0 forks source link

Shiny prikaz tabele in grafa #14

Open Duzo12 opened 5 years ago

Duzo12 commented 5 years ago

Pri shinyu sem naletel na problem. Želel sem prikazati SkupnoTabelo tako, da bi imeli na izbiro kateri stolpec želimo, da nam ga tabela prikaže, vendar ko poženem shiny mi naredi le okence v katerem lahko izbiram stopec, ne pa tudi tabelo. Zanima me kaj delam narobe?

Nato sem želel enako narediti tudi za TabeloPlace, kjer bi izbral za katero državo naj mi graf geombar prikaže vrednost, vendar nisem našel v shinyu nobenega primera iz katerega bi se to naučil, zato sem probal enako kot pri SkupnaTabela, vendar se mi sedaj ne prikaže ničesar.

MarvinHerzog commented 5 years ago

Najprej svetujem, da iz vizualizacija, analiza in uvoz pobrišeš source na ostale dele kode, saj jih pred tem uvoziš že v rmarkdown-u. Bolje je tudi, da recimo v skripti vizualizacija definiraš vse grafe in jih shraniš v spremenljivke, te pa nato s plot() ali print() kličeš v rmarkdown.

Zadevo s shiny sem rešil takole:

server.R:

library(shiny)
library(reshape2)
library(data.table)

SkupnaTabela$Drzava <- factor(SkupnaTabela$Drzava,levels=SkupnaTabela %>% arrange(Visina.place) %>% .$Drzava,
                              ordered = TRUE)

shinyServer(function(input, output) {

  output$izbor_stolpcev = renderUI({
    conditionalPanel(
      'input.dataset === "tab_skupna"',
      checkboxGroupInput("show_vars", "Kateri stolpec naj prikaže:",
                         names(SkupnaTabela), selected = names(SkupnaTabela))
    )
  })

  output$izbor_drzav = renderUI({
    conditionalPanel(
      'input.dataset === "tab_place"',
      checkboxGroupInput("izbrane_drzave", "Izberi drzave:",
                         TabelaPlace$Drzava, selected = c("Slovenia","Serbia"))
    )
  })

  output$tabelaSkupna <- DT::renderDataTable({DT::datatable(SkupnaTabela %>% select(input$show_vars))})
  output$tabelaPlace <- DT::renderDataTable({DT::datatable(TabelaPlace %>% filter(Drzava %in% input$izbrane_drzave))})

  output$grafplace <- renderPlot({

    indeksi_barv=which(rev(levels(SkupnaTabela$Drzava))%in%input$izbrane_drzave)
    nove_barve=replace(rep(NA,nrow(SkupnaTabela)),indeksi_barv,"red")

    ggplot(data =SkupnaTabela) +
      geom_bar(aes(x= reorder(Drzava, Vrednost.BDP), y=Vrednost.BDP,fill=nove_barve),stat = "Identity", show.legend = F)+
      coord_flip() +
      theme(axis.text.x = element_text(angle = 90, hjust = 1),text = element_text(size=9), plot.title = element_text(size = 20) ) +
      xlab("Država") + ylab("Vrednost BDP") + ggtitle("Vrednost BDP v državah po svetu")
  })
})

ui.R:

library(shiny)

shinyUI(fluidPage(
  title = " ",

  sidebarLayout(
    sidebarPanel(
      uiOutput("izbor_stolpcev"),
      uiOutput("izbor_drzav")
    ),

    mainPanel(
      tabsetPanel(
        id = 'dataset',
        tabPanel(value="tab_skupna",title = "Skupna", DT::dataTableOutput("tabelaSkupna")),
        tabPanel(value="tab_place",title = "Plače",
                 plotOutput("grafplace",height = 700),
                 DT::dataTableOutput("tabelaPlace")
   )
 )

    ))))

Še vedno se v konzoli pojavljajo errorji zaradi zaporedja klicov na reactive objekte (v hipu, ko se shiny naloži želi izrisati tabelo, vendar ne ve katere stolpce izbrati, ker še ni prejel inputa iz izbora stolpcev). Ti se sicer ne bodo videli na končnem projektu, je pa v splošnem vseeno smiselno premisliti kako to rešiti. To lahko narediš tako, da dodaš if/else preverbo na prazen izbor stolpcev, ali pa bolj strogo definiraš zaporedje klicev na reactive objekte.

Druga stvar je ta, da lahko opaziš da sem v server.R ponovno moral pretvoriti stolpec Drzava kot faktor. Tudi to lahko narediš že v skripti, kjer tabelo prvič definiraš, da se izogneš podvajanju kode.

Zadeve bi ti zdaj moralo izrisati pravilno, nadaljnjo oblikovanje pa prepuščam tebi.