Open jaanos opened 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č
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.
@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.
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.
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 naserver.R
inui.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:Č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#L4Imam še sledeče pripombe:
bolnik
,ima
inzd_delavec_na dolznosti
ste reference naredili s tipombigserial
, kar ni smiselno, saj se morajo njihove vrednosti sklicevati na že obstoječe vrednosti v drugih tabelah (te seveda so lahko tipabigserial
) - namesto tega lahko uporabitebigint
.ima
naj bo glavni ključ sestavljen iz obeh referenc (torejUNIQUE
nadomestite sPRIMARY KEY
), v tabelahbolnik
inzd_delavec_na dolznosti
pa samo izid_bolnika
oziromaid
(UNIQUE
je potem nepotreben - če se prav spomnim, ima vsak bolnik natanko enega zdravnika, kar bi bilo potrebno pokazati še na ER diagramu; sicer pa imate lahko tako kot prejPRIMARY KEY
na obeh stolpcih namestoUNIQUE
).stanje
v tabelioseba
je nepotreben, saj lahko njegovo vrednost dobite z ustreznimiJOIN
i s tabelamabolnik
inzd_delavec_na dolznosti
(seveda ga lahko potem še vedno prikažete pod Pacienti).simptom
so podatki uvoženi z napačnim kodiranjem znakov. Morda bo pomagalo, če ukazesource
kličete s parametromencoding="UTF-8"
.credentials
. Način generiranja in preverjanja gesel lahko ostane enak.auth.R
- uporabnikjavnost
ima zadostne pravice za uporabo aplikacije.bolnik
(oziromazd_delavec_na dolznosti
).