JanKolenc / COVID-19_BAZA

COVID-19 BAZA
MIT License
1 stars 2 forks source link

Aplikacija #1

Open jaanos opened 4 years ago

jaanos commented 4 years ago

Aplikacije trenutno ne morem pognati. Glavni problem je tukaj: https://github.com/JanKolenc/OPB-shiny/blob/6ca62ac5c3b6af4cba40588b9400d5e8e62c07b6/app/ui_server.R#L25 Tukaj uporabljate setwd za nastavitev delovnega imenika, s čimer si zagotovite, da bo aplikacija delovala samo na sistemih, kjer se vaša aplikacija nahaja na podanem mestu. Namesto tega raje aplikacijo razdelite na server.R in ui.R - tako bo RStudio pri poganjanju nastavil delovni imenik na mapo, kjer se programa nahajata, tako da lahko ostale programe kličete le z imenom datoteke. Na ta način bo mogoče aplikacijo poganjati tudi v Binderju.

Mimogrede, tudi pri uvozu se raje izogibajte uporabe ukaza setwd - če imate v RStudiu odprt projekt, bo delovni imenik nastavljen na vrhnjo mapo projekta, tako da so lahko poti do datotek relativne nanjo.

V README.md dodajte še povezavo za poganjanje v Binderju:

* [![Shiny](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/JanKolenc/OPB-shiny/master?urlpath=shiny/OPB-shiny/app/) Aplikacija Shiny

Če boste preimenovali repozitorij (kot sem predlagal v NoseF17/baza-podatkov-baza-korona#1), potem bo potrebno obakrat v zgornji vrstici nadomestiti OPB-shiny z novim imenom repozitorija; enako bo tedaj potrebno narediti tudi tukaj: https://github.com/JanKolenc/OPB-shiny/blob/6ca62ac5c3b6af4cba40588b9400d5e8e62c07b6/Dockerfile#L4

Imam še sledeče pripombe:

JanKolenc commented 4 years ago

Pozdravljeni, hvala za vse komentarje in pripombe. Popraviti nam je uspelo večino pomankljivosti. Težave smo imeli predvsem s prehodom iz single file shiny appa na two file shiny app. Kodo smo smiselno (najbrž ne ker ne deluje) razdelili med server in ui ampak žal ne deluje. Gledali smo če binder podpira single file shiny app in ga žal ne. Prosili bi za vašo pomoč pri delitvi. Prav tako pa nismo uspeli urediti obrazca z prikazovanjem samo ustreznih polj. In bi pri tem prav tako potrebovali pomoč. Računali smo da bi imeli zagovor 22.5 pri profesorju seveda če nam bo uspelo odpraviti napake in če se bo profesor strinjal. Hvala za pomoč

jaanos commented 4 years ago

V ui.R dodajte še uvoz knjižnice shinydashboard, v server.R pa odkomentirajte klic programa fte_theme.R, namesto auth.R pa uporabite auth_public.R - potem bi moralo delovati. Kot rečeno, naj bodo podatki o uporabnikih v bazi, ne v credentials.R.

Kar se tiče obrazca, ga bo potrebno razbiti na več delov, in sicer tako, da so v vsakem delu samo reference na elemente iz nadrejenih delov. Osnovni del obrazca je potem lahko

              div(
                tags$style(HTML("
                                input:invalid {
                                background-color: #FFCCCC;
                                }")),

                #==========================================Obrazec za dodajanje ljudi=========================================================

                useShinyjs(),
                shinyjs::inlineCSS(appCSS),
                bsAlert("alert"),
                id = "form",
                textInput("ime", "Ime in priimek", ""),
                textInput("naslov", "Naslov"),
                textInput("davcna", "Davčna števiilka"),
                dateInput("dat", "Datum vpisa v evidenco", format = "dd-mm-yyyy"),
                selectInput("stanje", "Stanje", c("bolnik", "zd_delavec_na_dolznosti", "zdrav")),
                uiOutput("obrazec.pogojno"),
                useShinyalert(),
                actionButton("submit", "Dodaj v bazo", class = "btn-primary")
              )

Pred tem bo treba definirati še

  output$obrazec.pogojno <- renderUI({
    validate(need(!is.null(input$stanje), ""))
    div({
      if (input$stanje == "bolnik") {
        div(
          selectInput("zdravnik", "Zdravnik", zdravniki),
          checkboxInput("hospitalizacija", "Ali je potrebna hospitalizacija?", FALSE),
          checkboxInput("glavobol", "Glavobol", FALSE),
          uiOutput("obrazec.glavobol"),
          # podobno še za druge simptome
        )
      } else if (input$stanje == "zd_delavec_na_dolznosti") {
        div(
          # obrazec za izbiro lokacije zdravnika
        )
      }
    })
  })

pred tem pa še obrazce za simptome, npr.

  output$obrazec.glavobol <- renderUI({
    validate(need(!is.null(input$glavobol), ""))
    div({
      if (input$glavobol) {
        div(
          numericInput("glavobol_j", "Jakost glavobola", value = NULL, min = 1, max = 10, step =  1),
          dateInput("glavobol_dat", "Datum prve pojavitve zgornjega simptoma", format = "dd-mm-yyyy")
        )
      }
    })
  })

Posebej je potrebno preveriti, ali so vrednosti nastavljene, saj na začetku še niso in bi zato sicer prihajalo do napak.

Opažam še, da ste v tabeli bolnik dali glavni ključ na dva stolpca. Ali ima torej bolnik lahko več zdravnikov? Iz obrazca bi sklepal, da ima lahko le enega; tudi podatki so taki. V tem primeru naj bo glavni ključ le na stolpcu id_bolnika.

Še to - glede na to, da ste naredili sledečo spremembo: https://github.com/JanKolenc/COVID-19_BAZA/blob/ecee31143865304a9315e6ada81a48bb2274c565/Dockerfile#L5 svetujem, da preimenujete OPB-shiny.Rproj v COVID-19_BAZA.Rproj. To sicer ne vpliva na delovanje aplikacije, pač pa le na odpiranje projekta, če zaženete RStudio v Binderju.

Glede termina zagovora se boste domenili z @alenFMF, ko boste končali. V vsakem primeru pa boste projekt (na kratko) predstavili v sklopu predstavitev na vajah 28.5.

JanKolenc commented 4 years ago

@jaanos hvala za pomoč. Vse zgornje smo popravili a pride še do neke manjše napake ki potem vpliva na Binder. Ko prvič prižgemo Rstudio in poženemo server iz ui.R dela normalno. Če app ustavimo v konzoli in ga ponovno poženemo pa se prižge za 1sec in nato samo izgine. V konzoli ne dobimo errorja. Gledal sem isti issue na https://github.com/rstudio/shiny/issues/975 ki pa nima rešitve. Ponovno bi vas prosili za pomoč, ker nam samo še to manjka pri projektu, da bo potem deloval tudi binder. Za zagovor smo dogovorjeni v petek 22.5 s profesorjem seveda pa se udeležimo tudi predstavitev.

jaanos commented 4 years ago

Nisem prepričan, v čem je problem - meni ni uspelo ponoviti napake. Možno je sicer, da se povezave na bazo ne zaprejo pravilno. Morda lahko poskusite v primeru zapiranja pred prekinitvijo povezave še ročno ustaviti tekoče poizvedbe:

  cancel.onSessionEnded <- session$onSessionEnded(function() {
    sapply(dbListResults(conn), dbClearResult)
    dbDisconnect(conn) 
  })

V primeru, da se vam to spet dogaja, lahko poskusite v konzoli zapreti odprte povezave, če bo to kaj pomagalo:

drv <- dbDriver("PostgreSQL")
conns <- dbListConnections(drv) # seznam odprtih povezav
sapply(conns, dbListResults) %>% sapply(sapply, dbClearResult) # zapremo tekoče poizvedbe
sapply(conns, dbDisconnect) # zapremo povezave

Da bo aplikacija delovala na Binderju, bo potrebno v server.R dodati sledeče:

DB_PORT <- as.integer(Sys.getenv("POSTGRES_PORT"))
if (is.na(DB_PORT)) {
  DB_PORT <- 5432
}

Binder namreč blokira privzeta vrata za povezavo na PostgreSQL, zato so v Dockerfile nastavljena alternativna vrata (in strežnik je nastavljen, da tam posluša). Potem bo potrebno pri povezavanju na bazo podati še vrata:

conn <- dbConnect(drv, dbname=db, host=host, user=user, password=password, port=DB_PORT)

Svetoval bi še, da v tabeli simptomov te izpišete z imeni (in morda dodaste še ime pacienta), ter da pri dodajanju zdravnika tudi ustanove izpišete z imeni.