Enda tehtud funktsioon

Vahel võib siiski juhtuda, et täpselt sellist funktsiooni nagu kasutajal vaja ei ole olemas (või lihtsalt ei õnnestu seda üles leida). Sellisel juhul on üheks võimalikuks lahenduseks ise vajaminev funktsioon valmis kirjutada.

Alljärgnevalt toome ühe näite, kus meil on vaja kokku liita kõik vektori elemendid, mis rahuldavad teatavaid tingimusi. Täpsemalt, olgu meil antud üks vektor positiivsete arvudega. Me tahame sellest vektorist kokku liita vaid need elemendid, mis ei ole liiga väikesed ega suured vaid jäävad meie poolt etteantud vahemikku. Seejuures kui kokku liidetud arvude summa ületab meie poolt ette antud piiri, siis rohkem arve, me liita ei soovi. Seega sisuliselt on iga arvu jaoks vektoris neli võimalust:

  1. arv liidetaks
  2. arvu ei liideta, sest see on liiga väike
  3. arvu ei liideta, sest see on liiga suur
  4. arvu ei liideta, sest nõutav summa on juba käes
Funktsiooni väljundina soovimegi algvektoriga sama pikkusega arvude jada, kus igal positsioonil on kirjeldatud, mis vastavast algvektori arvust sai.

Võime kirjutada järgmise funktsiooni:

> arvud=function(x,total=300,min=10,max=100){
> summa=0
> tulemus=rep("täis",length(x))
> for (i in 1:length(x)){
> if (x[i]>max){
> tulemus[i]="suur"
> next
> }
> if (x[i]<min){
> tulemus[i]="väike"
> next
> }
> if (summa<total){
> tulemus[i]="liideti"
> summa=summa+x[i]
> next
> }
> break
> }
> tulemus
> }

Kuidas sellest aru saada? Funktsiooni nimeks sai arvud. Funktsioonil on neli argumenti, millest kolmel viimasel olemas ka vaikeväärtused. Esimene argument saab väärtuseks vektori arvudega, teine määrab summa, mille saavutamisel enam arve juurde ei liideta, kolmas näitab piiri, millest väiksemaid ja neljas piiri, millest suuremaid arve ei liideta. Programmi sisu on sisestatud loogiliste sulgude vahele ja funktsiooni viimane (tegelikult eelviimane) rida tähistab funktsiooni väljundit.

Seega on funktsiooni sisestamisel üldkuju

funktsiooninimi=function(argument1=vaikeväärtus1,argument2=vaikeväärtus2,...){
funktsiooni sisu
}

kusjuures vaikeväärtused ei ole kohustulikud.

Funktsiooni rakendamine käib nüüd standardselt (nagu kirjeldatud üleeelmises alapunktis). Olgu nt defineeritud vektor arvudega

> vektor=c(32,11,101,1,3,4,22,145,67,3,2,36,57,46,98,12,35,24,99,11,34)

Kui nüüd anname käsu

> arvud(vektor,min=20)
[1] "liideti" "väike" "suur" "väike" "väike" "väike" "liideti"
[8] "suur" "liideti" "väike" "väike" "liideti" "liideti" "liideti"
[15] "liideti" "väike" "täis" "täis" "täis" "täis" "täis"

Sellise käsu korral kasutati argumentide total ja max vaikeväärtusi samas kui argumendi min väärtus anti kasutaja poolt ette.