NabergojV / APPR-2015-16

Repozitorij z gradivi za predmet Analiza podatkov s programom R v študijskem letu 2015/16
MIT License
0 stars 0 forks source link

funkcija dela, ampak ne vrne rezultatov, ko jo uporabim #3

Closed NabergojV closed 8 years ago

NabergojV commented 8 years ago

uredi<-function(x,y,z){ m=(x+z) for(i in x:m){ tabela[i,y]<-tabela[x,y] } }

uredi(2,2,60) uredi(3,3,2)

jaanos commented 8 years ago

Funkcija ne vrača rezultatov, ker ni tako napisana - zadnja stvar, ki se izvede, je zanka for, ki pa sama po sebi ničesar ne vrne. Če želiš kaj vrniti iz funkcije, na koncu uporabi return (ali pa samo na konec napiši, kaj vračaš). Funkcija razpredelnice tabela ne dobi kot vhod, ampak jo dobi "od zunaj", tako da to tudi popravlja.

Če prav vidim, želiš skopirati vnos tabela[x, y] v še naslednjih z vnosov v istem stolpcu. Namesto z zanko for to enostavneje in učinkoviteje narediš s

tabela[x:(x+z), y] <- tabela[x, y]

Opažam, da imaš kodo v datoteki podatki/README.md. To ni primerno mesto za kodo - programi naj bodo v datotekah s končnico .r. Za uvoz lahko uporabiš kar datoteko uvoz/uvoz.r (lahko prepišeš vzorčno vsebino). To datoteko lahko potem vključiš v poročilu (kakor je že v vzorcu).

Še to: če vstavljaš kodo v issue (ali kamorkoli v Markdown), potem pred njo postavi vrstico

```R

za njo pa vrstico



Tako bo koda kot taka prikazana in ustrezno pobarvana (`R` pomeni programski jezik R - namesto tega bi lahko uporabila tudi kak drug programski jezik za ustrezno barvanje). Na GitHubu imaš tudi zavihek _Preview_, kjer si lahko ogledaš, kako bo stvar izgledala.
NabergojV commented 8 years ago

Najepša hvala za hiter in jasen odgovor!

NabergojV commented 8 years ago

Funkcijo sem popravila, ampak mi še vedno ne pokaže rezultatov v tabeli oziroma niso trajni.

uredi<-function(x,y,z){
  tabela[x:(x+z), y] <- tabela[x, y]
  return(tabela)
}
jaanos commented 8 years ago

Če bi hotela imeti funkcijo, bi jo morala klicati kot

tabela <- uredi(2,2,60)

V bistvu pa funkcije sploh ne rabiš, ker lahko narediš kar

tabela[2:62, 2] <- tabela[2, 2]
NabergojV commented 8 years ago
uredi<-function(x){
    while(x<length(tabela[,2])){ 
    tabela[x:(x+60),2]<-tabela[x,2]
    x<-x+60+1}
}

rada bi sestavila tako funkcijo, ker bom morala drugače ponavljati

tabela[2:62, 2] <- tabela[2, 2]

velikokrat ( do prb 2442) kar zna biti zelo dolgotrajno. Pa tudi v 3. stolpcu kjer se mora ponavljati še z večjo frekvenco, ne samo 60. Če bi mi lahko prosim pomagali sestaviti tako funkcijo bi bila zelo hvaležna.

NabergojV commented 8 years ago

sem popravila že sama:

uredi<-function(x){
  while(x<length(tabela[,2])){ 
    tabela[x:(x+60),2]<-tabela[x,2]
    x<-x+60+1
  }
  return(tabela)
}
tabela<-uredi(2)
jaanos commented 8 years ago

Lepše (brez zank) bi šlo tako:

uredi <- function(tabela, x, y, z, max = nrow(tabela)) {
    s <- seq(x, max, z+1)
    tabela[t(matrix(x:max, ncol=length(s))), y] <- tabela[s, y]
    return(tabela)
}

tabela <- uredi(tabela, 2, 2, 80, 1540)
tabela <- uredi(tabela, 1542, 2, 80, 3080)

Naj malo pojasnim, kaj se tukaj dogaja: vektor s nam pove, kje se nahajajo vrednosti, ki jih želimo skopirati. Te vrednosti (tabela[s, y]) želimo potem spraviti na ustrezna mesta od x do max. Te indekse spravimo v matriko s toliko stolpci, kolikor je vnosov v s (matrika se polni po stolpcih). Funkcija t transponira matriko, ki se potem uporabi za indeksiranje. Pretvorba nazaj v vektor gre spet po stolpcih - sedaj v vsakem stolpcu skačemo po length(s). Ker je vektor na desni krajši od mest, kamor pišemo, se ta ciklično dopolni tako, da se vrednosti napišejo ravno na pravo mesto.

Funkciji lahko sedaj podaš tudi, za katero tabelo gre, da jo boš lahko uporabljala tudi drugod (seveda je sedaj return nujen, sicer se bodo spremembe poznale samo znotraj funkcije).

Svetujem ti sicer, da pobrišeš vrstice, kjer nimaš podatkov - najbolje, da to narediš takoj za vsakim klicem funkcije uredi (spet si lahko pomagaš s seq) - potem bodo potrebni trije klici funkcije uredi in tri brisanja.