LeaTehovnik / krompir1

Repozitorij pri predmetu Osnovne podatkovnih baz. Avtorice: Lea Tehovnik, Katarina Černe, Maja Furlan
0 stars 1 forks source link

Shiny #3

Open CerneK12 opened 8 years ago

CerneK12 commented 8 years ago

Ker je v četrtek zmanjkalo časa, nas zanima, če je sedaj naša baza.r pravilno formulirana?

V datoteki sestavine.r nam javlja napako: potrebujemo <- data.frame(r, s, kolicina) Error in data.frame(r, s, kolicina) : arguments imply differing number of rows: 38, 43, 32

V datoteki uvoz_tabel.R pa nam javlja napako pri: hrana <- rbind(hrana, ostalo)...

V tabeli hrana nam pri kategoriji 'ostalo' izpiše vrednosti NA..

Imamo pa še vprašanja glede shinyja. Če bi npr. hotele, da nam vrže recept, ki ima manj kot 500 kcal, bi morale verjetno formulirati neko funkcijo, ki bi nam vse ustrezno zmnožila in seštela, samo ne vem, če bo to sploh šlo..

Bi imeli morda jutri po 12.00 kaj časa, zanima nas predvsem shiny?

Hvala in lp

jaanos commented 8 years ago

Trenutno imate v baza.r dve funkciji create_table - kot kaže, je prišlo do konflikta, ki ga niste pravilno razrešile. Izgleda, da je bila zadnja sprememba datoteke baza.r v commitu 27dc0544 - najbrž bo najbolje, če skopirate vsebino te datoteke iz tega commita (kliknite na View, da se pokaže celotna datoteka).

Pri tabeli hrana vam manjka referenca na kategorijo - treba bo torej najprej narediti tabelo kategorija, potem pa pri hrana dodati stolpec kategorija INTEGER REFERENCES kategorija(id). Prav tako naj stolpec ime ne bo tipa SERIAL - imejte raje stolpca id SERIAL PRIMARY_KEY in ime TEXT (po želji lahko še UNIQUE). Enako velja tudi za tabelo recept; tudi pri tabeli kategorija naj bo id tipa SERIAL. V tabeli potrebujemo naj bosta referenci potem tipa INTEGER (saj je SERIAL samo INTEGER z dodanim števcem).

Pazite še na velikost črk v imenih datotek - imenik 2-podatki imate v repozitoriju z malimi črkami, zato tako podajte tudi pri branju datotek.

Ko sam poženem sestavine.R, mi deluje - ni mi jasno, zakaj ne bi, glede na to, da so vsi podatki v samem programu. Sicer pa bi svetoval, da tabeli potrebujemo dodaste še stolpec enota - tudi pri grajenju razpredelnice potrebujemo potem količino razbijte na dva stolpca - prvi naj bo številski, drugi pa naj vsebuje enote kot nize (v ednini). Tudi uvoz_tabel.R mi deluje brez napak (v hrana tudi ni NA-jev pri kategoriji ostalo).

Kar se poizvedbe s skupnimi kalorijami tiče, bi to načeloma šlo, edino enote bi znale biti problem. Ob predpostavki, da so vse enote v receptih v gramih in da so kalorije v tabeli hrana podane za 100 gramov, bi šlo nekaj takega:

con <- src_postgres(dbname = db, host = host, user = user, password = password)
tbl.hrana <- tbl(con, "hrana")
tbl.recept <- tbl(con, "recept")
tbl.potrebujemo <- tbl(con, "potrebujemo")
data <- inner_join(tbl.potrebujemo, tbl.hrana, by = c("sestavine" = "id")) %>%
  group_by(recept) %>% summarise(kcal = sum(kolicina*kcal/100)) %>% filter(kcal < 500) %>%
  inner_join(tbl.recept, by = c("recept" = "id")) %>% select(-recept) %>% data.frame()

Če povzamem: najprej za vsako sestavino v receptu pridobimo podatke o ustrezni hrani, ter seštejemo kalorije za vsak recept. Nato filtriramo glede na želeno omejitev in dobljene podatke združimo s tabelo recept, da dobimo razpredelnico s podatki o receptu skupaj z izračunanimi kalorijami. Iz razpredelnice izpustimo stolpec recept, saj je to ponovljen podatek, ki se je uporabil za združevanje.

Glede na to, da imate tudi druge enote, bi bilo potrebno narediti še eno tabelo, ki za vsako hrano pretvori enoto npr. v grame. Potem bi zgornja poizvedba imela še en join, ki bi nam omogočal pravilen izračun kalorij za dano sestavino.

Lahko se zglasite jutri ob 12h v kabinetu 5.14, pa bomo še kaj pogledali.