ul-fmf / projekt-tomo

Spletna storitev za poučevanje programiranja
https://www.projekt-tomo.si
GNU Affero General Public License v3.0
14 stars 23 forks source link

Manjkajoča funkcionalnost za R #172

Closed jaanos closed 2 years ago

jaanos commented 6 years ago

Z @jernejbanevec sva danes ugotovila, da za R ni vse funkcionalnosti, ki jo ponuja Tomo za Python. Kolikor vidim, manjka sledeče:

Za prvi dve točki bom kar odprl pull request - ostalo lahko morda kasneje implementiramo.

matijapretnar commented 6 years ago

Razmišljam, da bi v Pythonu stvari malo posplošil. Na primer, trenutno vsaka funkcija sprejme neobvezen argument env, ki nastavi lokalno okolje. To bi bilo verjetno bolje narediti s context managerjem, da bi lahko napisal with Check.set_environment(x=10, y='abc'). Ali bi se dalo kaj podobnega narediti tudi v R-ju?

jaanos commented 6 years ago

V R obstaja funkcija with, s katero se lahko nastavi lokalno okolje:

> x <- 1
> with(list(y = 2), {
+   z <- x+y
+   y <- y+40
+   x <- 7*x
+   cat(x, y, z)
+ })
7 42 3
> x
[1] 1
> y
Error: object 'y' not found
> z
Error: object 'z' not found

Bi to zadostovalo?

jaanos commented 6 years ago

Malo sem gledal, kaj se da naredit v Pythonu, pa nekako izgleda, da tako nastavljanje lokalnega okolja, razen z eval, sploh ni mogoče (da se sicer spremenit slovar locals(), ampak je odvisno od implementacije, če se bo to dejansko poznalo na okolju). Še najbolj čista rešitev se mi zdi, da bi imeli nek globalen sklad okolij (npr. Check.env_stack) - Check.set_environment bi potem na vrh sklada dodal okolje, dopolnjeno z novimi vrednostmi (in ga ob izhodu pobrisal), vse ostale funkcije pa bi za env uporabile okolje z vrha sklada, če ta parameter ni podan (tako da ohranimo združljivost trenutnih testov). @matijapretnar, kaj praviš?

V R-ju pa with lepo deluje (namesto s seznamom lahko tudi z okoljem, tako da se spremembe poznajo). Sem včeraj implementiral check$run, pa bom poskusil še z drugimi funkcijami.

matijapretnar commented 6 years ago

Ja, to se mi zdi smiselno. Podobno bi imel tudi npr. za clean ali kakšne nastavitve. Sicer pa običajno hočeš imeti vsa okolja, tako da ne bi vzel samo vrhnjega, ampak bi kar naredil update od prvega do zadnjega (tako da ima zadnji prednost).

jaanos commented 6 years ago

Mislil sem, da ko se doda novo okolje, se naredi kopija vrhnjega in se jo dopolni z novimi vrednostmi (razen mogoče, če se eksplicitno zahteva sveže okolje). Ali si kako drugače mislil?

matijapretnar commented 6 years ago

Aha, sem spregledal. Ja, je smiselno.

matijapretnar commented 2 years ago

Ni treba, da ima testiranje za R popolnoma enake funkcije kot tisto za Python. Vmes se je tisto za Python spremenilo in ima npr. tudi testiranje generatorjev, ki ga v R nikoli ne bo. Tako da tole lahko mirno zapremo.