Open CerneK12 opened 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.
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