Closed NabergojV closed 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.
Najepša hvala za hiter in jasen odgovor!
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)
}
Č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]
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.
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)
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.
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)