BraMira / Mirjam-Spela

Projekt pri predmetu OPB 2015/2016
0 stars 4 forks source link

Aplikacija 1 #7

Closed BraMira closed 8 years ago

BraMira commented 8 years ago

Imam par vprašanj v zvezi s prvo aplikacijo v mapi 5.Shiny. In sicer, bi rada narisala histogram, kjer x=meseci, y=št. napadov, uporabnik pa ima še izbiro, da lahko gleda samo za katere kontinente, religije in če se je zgodilo v glavnem mestu ali ne. Nekako sem si v tabeli ttt4 pripravila vse podatke, ki jih bom rabila, sedaj pa ne vem kako naj nadaljujem. Rabila bi vbistvu prešteti št. napadov za vsak mesec glede, na to kaj odkljukaš na začetku, vendar kako naj dobim kateri mesec, ker ukazi months in podobni ne delajo na tej tabeli? In kaj potem vstavim v barplot?

Lp

BraMira commented 8 years ago

Za par vprašanj sem že našla rešitev. V no_attacks sem vbistvu shranila število napadov v mesecih, kar je vbistvu, če povsod odkljukaš All. Sedaj pa me zanima kako bi pogledala koliko napadov se je zgodilo v vsakem mesecu, če imaš obkljukano določeno religijo, kontinent, gl. mesto. Sem poskusila nekako prešteti, kjer sem prej hotela narediti group_by, vendar to ni prijelo. Bi se to vbistvu dalo narediti v enem koraku v barplot ali kako drugače?

spelapovrzenic commented 8 years ago

:)

jaanos commented 8 years ago

Najprej bi svetoval, da dasta uporabniku javnost pravico povezovanja na bazo in branje tabel, na repozitorij pa vključita datoteko, kot auth.R (seveda z drugim imenom, da jo bosta lahko naložila) s podatki za prijavo s tem uporabnikom, in to vključita v aplikacijo.

V pull requestu #9 je poskrbljeno za izrisovanje stolpčnega diagrama. Svetujem, da za to uporabita kar knjižnico ggplot2, ki omogoča lažje izrisovanje grafov in je posebej prirejena za delo s podatki, ki pridejo iz podatkovne baze.

Na nekaj stvari bi opozoril. Pri inner_join parameter copy = TRUE ni potreben, saj sta vsakič obe tabeli v bazi, tako da tako kopiranje ni potrebno. Tako tudi ni potrebno povleči celotnega nabora podatkov, pač pa se samo pripravi poizvedba, ki se nato pred samim izrisovanjem grafa dopolni z želenimi filtri. Za imena mesecev se uporabil vgrajeno tabelo month.name, lahko pa seveda tudi sami podasta npr. slovenska imena mesecev.

Da bo poizvedba delovala, morata v bazo dodati funkcijo month, ki iz datuma pobere številko meseca. To lahko storita tako, da izvedeta

CREATE FUNCTION month(date)
RETURNS integer AS
'SELECT extract(month FROM $1)::integer;' LANGUAGE SQL;

Po tem bo funkcija month na voljo za uporabo.

Opozoril bi še na dvakratno uporabo group_by v poizvedbi. Ta je potrebna, ker se lahko isti napad pojavi večkrat (npr. v več krajih ali v kraju z več religijami). Tako se najprej opravi združevanje po napadu, obenem pa se zanj pobere še mesec; naslednje združevanje prešteje število različnih napadov v mesecu (v SQL bi lahko uporabili COUNT DISTINCT, a z dplyrjem žal tako ne gre).

BraMira commented 8 years ago

Da javnost vidi tabele sem dala GRANT SELECT ON continent TO javnost; za vsako tabelo, vendar to ne deluje več, če bazo na novo naložim. A obstaja kaki drugi ukaz ali je bolje narediti funkcijo, ki to naredi? Zanima me še, če se te tabele, v shinyju da kako še preoblikovati, npr. širina,imena stolpcev itd. In pa v aplikaciji, mi na koncu strani piše naslov naslednje aplikacije, pa ne vem kako se ga znebim. In pa še ko sem poskusila aplikacijo 2 dodati k 1, da bo vse na istem mestu, mi tega noče narediti. Ne javi mi nobene napake, enostavno mi nobene tabele in grafa ne nariše.

Hvala za pomoč.

jaanos commented 8 years ago

Kar se pravic tiče, je najbolje, če se ustrezni ukazi GRANT izvedejo kar v funkciji, ki ustvari tabele.

Kar se imen stolpcev tiče, ta ustrezajo ravno imenom stolpcev prikazane razpredelnice. Te lahko preimenuješ z obstoječim select, npr.

    d <-inner_join(t,tbl.in_country,by=c("attack_id"="attack"), copy=TRUE) %>%
      select(Start = start_date,
             End = end_date,
             "Max. deaths" = max_deaths,
             ...)

Če bi želela preimenovati samo del spremenljivk, bi to lahko storila z rename - ta deluje na isti način kot select, le da ohrani vse spremenljivke in samo navedene preimenuje.

Namesto funkcij renderTable in tableOutput lahko uporabiš tudi DT::renderDataTable in DT::dataTableOutput. Tako se bo tabela lepše prikazala (med drugim se bodo tudi datumi prikazali pravilno in jih ne bo treba ročno pretvoriti, kot npr. v vzorcu).

Naslov se na dnu izpiše zaradi ukaza titlePanel v vrstici 43 v ui.R. Ta je podan kot argument funkcije tabsetPanel, ki pa pričakuje same tabPanel. Ker ne ve, kam naj ta naslov da, ga očitno postavi na konec.

Če želiš vključiti še drugo aplikacijo, bo to najbolje storiti znotraj zavihka - v ui.R dodaj torej nov tabPanel, ki vsebuje vse znotraj fluidPage v ui.R druge aplikacije. V server.R (znotraj shinyServer) potem prekopiraj še vse elemente output$... (povezava na bazo in tabele so v okbeh primerih iste). Paziti bo treba, da se imena vhodnih in izhodnih elementov ne ponavljajo - vsako vnosno polje naj ima torej svoje ime (tudi, če so v različnih zavihkih), prav tako vsak element output$....