Presentation is loading. Please wait.

Presentation is loading. Please wait.

Funkcijos R.

Similar presentations


Presentation on theme: "Funkcijos R."— Presentation transcript:

1 Funkcijos R

2 Funkcijos Funkcijos įvesties duomenis pagal nurodomus argumentus ir numatytus veiksmus paverčia norimu rezultatu. Visi veiksmai R atliekami naudojant funkcijas („[„ taip pat funkcija. Pabandykite ?"[") . R ir paketuose yra daug funkcijų, tačiau vartotojai gali sukurti ir savo funkcijas. R funkcijos kuriamos naudojant funkciją function(). function_name <- function(arg_1, arg_2, ...) { funkcijos veiksmai } Funkcijos išsaugomos kaip R objektas. Geriau nenaudoti egzistuojančių funkcijų pavadinimų!

3 Funkcijos Sukūrus funkciją (funkcijos objektą) ją galima naudoti kaip įprastinę funkciją. Sukurkime funkciją skirtą paversti temperatūrą Celsijaus Tc laipsniais į temperatūrą Farenheito Tf laipsniais. > tCelToFar<-function(x){x*1.8+32} > tCelToFar(0) [1] 32 Atkreipkite dėmėsį, kad darbinėje aplinkoje sukūrėme objektą tCelToFar. Patikrinkite kokia šio objekto klasė (class()) Trumpas funkcijas galima sukurti konsolėje, tačiau dažnai patogiau jas kurti kaip atskirą kodą. Apskaičiuokite koks bus funkcijos tCelToFar rezultatas su -10:10 reikšmėmis.

4 Funkcijos argumentai Kuriant funkcijas nurodomi formalūs argumentai function(x,y,z){} nesukuria objektų x, y ir z. Šie argumentai naudojami tik matematinei išraiškai nusakyti. Pvz. (x+y)/z Sukurkite funkcija f1<-function(x,y,z){(x+y)/z} Sukurkite 4 vektorius: a<-1:10 b<-11:20 c<-21:30 x<-“a“ Parašykite komandą f1(a,b,c) Ar darbinėje aplinkoje atsirado y, z? Kokia x reikšmė?

5 Funkcijos argumentai Funkcijos argumentai (įvesties duomenys ir parametrai) gali būti dvejų tipų: argumentai, kuriuos būtina nurodyti ir argumentai turintys numatytas vertes. Sukurkime funkciją laipsniu laipsniu<-function(x,k=2){x^k} > laipsniu(5) [1] 25 > laipsniu(5,3) [1] 125 Pabandykite nenurodyti nei vieno argumento laipsniu().

6 Funkcijos argumentai „...“ argumentas gali būti naudojamas perduoti argumentus kitoms funkcijoms įtrauktoms į kuriamą funkciją. Apskaičiuokite a<-c(1,2,NA,3) vidurkį. Sukurkime funkcija: vidurkis.is.2<-function(x,...){mean(x,...)/2} Apskaičiuokite funkcijos vidurkis.is.2 reikšmę naudodami a. Kaip išvengti, kad vidurkis.is.2(x) būtų ne NA?

7 Funkcijos argumentai Funkcijos argumentai gali būti kitos funkcijos pavadinimas (pvz., min, max, sd ir t.t.). Sukurkime funkciją f2<-function(x,FUN){FUN(x)} Apskaičiuokite su f2 skaičių nuo 1 iki 10 maksimumą, minimumą, sumą, vidurkį, standartinį nuokrypį, kvadratinę šaknį.

8 Funkcijos rezultatas Funkcijos gražinamas rezultatas yra paskutinio veiksmo rezultatas (tik vienas). Jei skaičiavimo rezultatą/us priskiriame objektams jie nėra sukuriami, nes tai vietiniai funkcijos objektai. Parašykite funkcijos kodą (ne konsolėje) ir jį įvykdykite. f3<-function(x) { min<-min(x) max<-max(x) vidurys<-(max-min)/2 } Koks komandos f3(1:30) rezultatas?

9 Funkcijos rezultatas Jei norime gauti lokalaus kintamojo rezultatą reikia įtraukti į kuriamą funkciją return(). Papildykite funkciją f3 nauja eilute ir jį įvykdykite. f3<-function(x) { min<-min(x) max<-max(x) vidurys<-(max-min)/2 return(vidurys) } Koks komandos f3(1:30) rezultatas?

10 Funkcijos rezultatas Jei norime kad funkcija gražintų kelis rezultatus turime naudoti funkcijas list() arba data.frame(). Papildykite funkciją f3 nauja eilute ir jį įvykdykite. f3<-function(x) { min<-min(x) max<-max(x) vidurys<-(max-min)/2 data.frame(vid=vidurys, minimumas=min, maksimumas=max) } Koks komandos f3(1:30) rezultatas? Koks komandos f3(1:30) rezultatas jei vietoje data.frame() naudosime list(). ?

11 Sąlyginės komandos R naudojamos dvi sąlyginės komandos if ir switch.
if(test) { ...true statements... } else ...false statements... test yra loginė sąlygą, kuri tikrinama (pvz., x<2 ) switch(object, "value1" = {expr1}, "value2" = {expr2}, "value3" = {expr3}, {other expressions} ) switch vykdo veiksmus pagal tai kokios yra objekto reikšmės.

12 Sąlyginės komandos If ir swich yra ne vektorinės komandos, todėl jos gali tikrinti sąlygą pagal vieną reikšmę (vektorių kurio ilgis vienas). Parašykite kodą f4<-function(x,riba=10){ if(x>riba) {"Daugiau"} else {"Maziau"}} Pritaikykite funkciją f4 skaičiams 9, 11 ir vektoriui 9:11. Dėl šių priežasčių If ir swich dažniausiai R taikomos funkcijose, tikrinant ar nesusidaro skaičiavimų sąlygos lemiančios klaidas.

13 Sąlyginės komandos Jei norime atlikti veiksmus su vektoriais galime naudoti funkciją ifelse(sąlyga, tiesa, netiesa). Sukurkite funkciją f5 f5<-function(x,riba=10) { ifelse(x>riba,"Daugiau","Maziau") } Pritaikykite funkciją f5 skaičiams 9, 11 ir vektoriui 9:11. Jei reikia patikrinti kelias sąlygas sąlyginėse komandos gali būti naudojamos kitos sąlyginės komandos pvz. ifelse(test, yes, ifelse(test, yes, no))

14 Sąlyginės komandos Parašykite funkciją naudodami ifelse skirtą apskaičiuoti mėnesio sniego kiekį pagal temperatūrą, kritulių kiekį ir dvi ribines temperatūras tl ir ts. s = 0 kai t ≥ tl s = p kai t ≤ ts s = p* (tl-t)/(tl-ts) kai ts ≤ t ≤ tl Čia s – sniego kiekis, p – kritulių kiekis, t – temperatūra, ts – temperatūra žemiau kurios visi krituliai sniegas, tl – temperatūra aukščiau kurios visi krituliai lietus. Apskaičiuokite koks bus sniego kiekis jei iškrito 100 mm kritulių, buvo 0 °C, tl= 2, o ts=-1. (Sniego 66.7 mm) Atsisiųskite temperatūros ir kritulių duomenis iš hkk.gf.vu.lt ir apskaičiuokite kritulių iškritusių sniego pavidalu kiekį kiekvieną mėnesį.

15 Ciklai Ciklai programavime naudojami kai reikia pakartoti dalį komandų tam tikrą skaičių kartų arba kol patenkinama tam tikra sąlyga. R ciklai naudojami retai, nes dažniau patogiau naudoti funkcijas skirtas atlikti vektorinius skaičiavimus (pvz. apply šeimos funkcijos). R yra trys ciklų formos for, while ir repeat. for (i in seka) { komandos } while (sąlyga) { komandos } repeat { komandos } for ciklas taikomas visoms sekos reikšmėms while ciklas taikomas kol patenkinama sąlyga repeat ciklas taikomas kol jis nenutraukiamas

16 Ciklai while ciklo komandose būna įtraukta bent viena komanda, kuri keičia objektą pagal kurį tikrinama sąlyga. Sukurkite funkciją f8 skirtą patikrinti kada bus sugeneruotas atsitiktinis skaičius didesnis už pasirinktą ribą. f8 <- function(riba=2){ skaicius<-0 n <- 0 while(skaicius <riba){ skaicius <- rnorm(1) n <- n +1 } print(paste("Reikėjo", n, "ciklų")) Apskaičiuokite po kelių ciklų bus sugeneruotas skaičius didesnis už 2 ,3 ,4 . Ciklas

17 Ciklai Sukurkite funkciją, kuri konsolėje parašytu visus skaičius nuo 1 iki x. f9 <- function(x){ for (i in 1:x) { print(i) } Sukurkite funkciją f10, kuri konsolėje parašytu visus skaičius nuo x1 iki x2. Įvykdykite f10 su x1=3, x2=10 x1=3, x2=-10 Ciklas

18 Ciklai Naudodami for sukurkime f11, kurios rezultatas būtų matricą su skaičiumi nuo 1 iki x pirmame stulpelyje, o antrame stulpelyje būtų šio skaičiaus kvadratas. f11 <- function(x){ m<- matrix(, nrow = x, ncol = 2) for (i in 1:x) { m[i,1]<-i m[i,2]<-i^2 } return(m) Sukurkite funkciją f12, kuri sukurtų matricą panašią į f11, tik trečiame stulpelyje būtų skaičius pakeltas kubu. Sukurkite funkciją f13, kuri veiktų kaip f12, tik naudodami ne ciklus, o vektorinius skaičiavimus. Ciklas

19 Ciklai for ciklai kartais gali būti taikomi kai vektorinių veiksmų išraiška sudėtinga, o dirbame tik su kelių dimensijų objektais. Suskaičiuokime kiek kiekvienoje MS buvo mėnesių su sniego danga plonesne nei 5 cm (sniegas.csv). x<-vector(mode="numeric", length=57) for (i in 1:57) { x[i]<-sum(sniegas[,i+2]<5, na.rm = TRUE) } Suskaičiuokite kiekvienos MS sniego dangos storio standartinį nuokrypį (sniegas.csv) ir pavadinkite vektoriaus narius pagal MS pavadinimus. Naudodami funkciją cor() apskaičiuokite sniego dangos storio stulpeliuose koreliacija su stulpelių sniego danga (paaeiliui t.y. 10 su 20, 11 su 21 ir t.t.)

20 apply funkcijos Ciklai R gali būti lėti jei dirbame su dideliu duomenų kiekiu. Rekomenduojama vietoje ciklų naudoti apply šeimos funkcijas, kuriose ciklai yra integruoti funkcijos kode ir parašyti greitesne C kalba. Apply funkcijos skirtos pritaikyti pasirinktą arba vartotojo sukurtą funkciją objekto dedamosioms (pvz., stulpeliams, eilutėms)

21 apply funkcijos Svarbiausios apply šeimos funkcijos:
apply – pritaiko norimą funkciją pasirinktoms masyvo (matricos) dimensijoms arba dataframe stulpeliams. lapply – pritaiko norimą funkciją sąrašo nariams arba dataframe stulpeliams. lapply rezultatas – sąrašas. sapply – kaip ir lapply tik rezultatas vektorius. tapply – pritaiko funkciją masyvui sudarytam iš dvejų vektorių: reikšmių ir grupuojančio kintamojo. mapply – pritaiko funkciją paeiliui kelių objektų nariams (pavyzdžiui apskaičiuoja 3 vektorių, pirmų, antrų, trečių ir t.t. standartinį nuokrypį.

22 apply apply funkcijos sintaksė: apply(X, MARGIN, FUN, ...)
X – objektas kuriam pritaikome funkciją, MARGIN – dimensija (os) pagal kurią/kurias objektas skaidomas, FUN – funkcija kurią pritaikysime. MARGIN – nurodo dimensijos numerį, pvz., jei norime skaičiuoti pagal dimensijos eilutes MARGIN bus 1, jei pagal stulpelius – 2 ([eilutės, stulpeliai]). Jei pritaikome funkciją daugiadimensiniam masyvui galime nurodyti kelias skaidymo dimensijas pvz., A.vidurkis <- apply(A, c(1,2), mean). Suskaičiuokite su apply funkcija sniego dangos storio standartinį nuokrypį (3-59 stulpeliai) pagal MS ir laiko žingsnius (eilutes).

23 lapply ir sapply lapply ir sapply funkcijų sintaksė:
lapply(X, FUN, ...) sapply(X, FUN, ...) X – objektas kuriam pritaikome funkciją, FUN – funkcija kurią pritaikysime. Padarykite sąrašą klimatas<-list (rcp2.6=rnorm(10), rcp4.5=rnorm(15), rcp8.5=rnorm(20)) Apskaičiuokite sąrašo klimatas narių vidurkius taikydami lapply ir sapply funkcijas. Kuo skiriasi rezultatas? Naudojant apply šeimos funkcijas galima naudoti vartotojo sukurtas funkcijas. Ką gauname įvykdę komandą sapply( klimatas, function(x) { sum(x<0) } )? Ką gauname įvykdę komandą lapply( klimatas, function(x) { x[x<0] } )?

24 tapply tapply (veikia kaip aggregate, bet su vektoriumi) funkcijos sintaksė: tapply(X, INDEX, FUN, ... ) X – vektorius (!) kuriam pritaikome funkciją, INDEX – vektorius su grupavimo reikšmėmis, FUN – funkcija kurią pritaikysime. Koks rezultatas bus pritaikius komandą tapply(sniegas[["Vilnius"]], sniegas$Month, mean) ? Norint pritaikyti tapply visiems stulpeliams reikia ją įtraukti į kitą apply šeimos funkciją: sniegas.lap.tap<-lapply(sniegas[,3:59], function(x){tapply(x,sniegas$Month,mean, na.rm=TRUE)}) Gaukite tą patį rezultatą pritaikydami apply funkciją ir priskirkite jį sniegas.app.tap (atkreipkite dėmesį kuo skiriasi lapply ir apply sintaksė).

25 mapply mapply funkcijos sintaksė: mapply (FUN, objektai)
FUN – funkcija kurią pritaikysime (bent du argumentai (pvz. function(x,y){} ), objektai - objektai kuruos naudosime apskaičiuoti rezultatą (funkcijos x ir y). mapply naudojama, kai taikoma funkcija negali atlikti vektorinių skaičiavimų. Sukurkite funkciją sniegas2<-function(t,p){if (t>0) 0 else p} Apskaičiuokite sniegą naudodami funkciją sniegas2 ir temperatūros bei kritulių duomenis iš HKK (pavyzdyje naudotas data frame pavadinimas tp): tp$sniegas<-sniegas2(tp$T, tp$P) Apskaičiuokite sniegą naudodami funkciją sniegas2 ir mapply. tp$sniegas<-mapply(sniegas2, tp$T, tp$P)


Download ppt "Funkcijos R."

Similar presentations


Ads by Google