Az R programozási nyelv

Alprogramok, modulok

Az R nyelvben csak függvények vannak, eljárások nincsenek. Minden függvénynek van formális argumentum listája, törzse és környezete. Mivel maguk a függvények is objektumok a nyelvben, ezért szabadon használhatjuk ezeket argumentumként, vagy visszatérési értéknek.

Szintaxis

Függvény definiálása

function(arglista) törzs

Egy függvénydefiníciót értékül adhatunk egy változónak, ezzel nevet rendelhetünk hozzá. Lehetőségünk van azonban név nélkül is definiálni egy függvényt, ezt általában aktuális paraméterként szoktuk használni.

Függvény hívása

függvény_hivatkozás(arg1, ... , argN)

A függvény_hivatkozás legegyszerűbb esetben egy azonosító – a függvény neve – , de lehet karakterlánc és egy függvény objektumot szolgáltató kifejezés is. Az argumentumok kifejezések vagy név=érték alakúak (ezzel név szerinti paraméter átadás lehetséges). Minden függvényhívásnál egy új környezetet hozunk létre, amelynek befoglaló környezete a függvény környezete.

Formális argumentumlista

Vessző karakterekkel elválasztott argumentumok alkotják, amelyek a következők lehetnek: szimbólum, szimbólum = alapértelmezés, "..." karaktersorozat. A második eset alapértelmezett értéket ad az argumentumnak. A harmadikat (...) változó argumentumszámú függvényeknél és argumentumlista továbbadásnál használhatjuk. Az argumentumlista lehet üres. A missing(szimbólum) függvényhívás megadja, hogy az adott formális argumentumhoz meg lett-e adva aktuális argumentum a hívás során.

Paraméterátadás

A paraméterkiértékelés névszerinti kötés illetve sorrendi kötés alapján történik. Mivel formális argumentumokhoz meg lehet adni alapértelmezett értéket, a hívásnál megadott argumentumok száma lehet kevesebb a formális argumentumok számánál. Függvény lehet változó argumentumszámú. A paraméterátadás érték szerint történik.

Az aktuális és formális argumentumok megfeleltetése

Az aktuális és formális argumentumok megfeleltetése az alábbiak szerint három lépésben történik: 1. teljes névegyezés alapján, 2. részleges névegyezés alapján, 3. sorrend alapján. Hibát okoz, ha az algoritmus végén nem lesz párja egy aktuális argumentumnak, vagy egy olyan formális paraméternek, amelynek nincs alapértelmezett értéke.

Teljes névegyezés alapján: Minden névvel megadott aktuális argumentumot meg kell feleltetni az azonos nevű formális argumentumnak. Hiba, ha egy formális argumentumnak több aktuális argumentum is megfelel.

Részleges névegyezés alapján:Az előző lépésben formális argumentumoknak nem megfeleltetett névvel megadott aktuális argumentumok mindegyikéhez olyan formális argumentumot keres a megmaradtak közül, amelynek neve az adott aktuális argumentum nevével kezdődik. Hiba, ha egy aktuális argumentumhoz több ilyen formális argumentum van. Tehát név szerinti paraméter átadásnál nem kötelező kiírni egy formális argumentum teljes nevét, ha az egyértelműen rövidíthető. Ha a formális argumentumok között van ..., akkor a részleges névegyezés vizsgálata csak az ezt megelőző formális argumentumoknál történik meg.

Sorrend alapján:Az előző két lépésben kimaradt formális argumentumok megfeleltetése a megmaradt aktuális argumentumoknak a megadásuk sorrendjében. Ha van a formális argumentumlistán ..., akkor ennek meg kell feleltetni az összes kimaradt aktuális argumentumot.

Az argumentumok kiértékelése

Az aktuális argumentumok és az alapértelmezett argumentumok kiértékelése másként történik. Az aktuális argumentumok kiértékelése a hívó függvény környezetében, míg az alapértelmezett argumentumok kiértékelése a függvény környezetében történik. Egy argumentum kiértékelése csak akkor történik meg, ha szükség van az értékére. Elképzelhető, hogy egyáltalán nem is értékelődik ki egy aktuális argumentum, ezért ne adjunk aktuális paraméterként olyan mellékhatásos kifejezéseket, mint például az értékadás!

A függvény visszatérési értéke

A törzs a függvény visszatérési értékét szolgáltató kifejezés. Lehet egyetlen kifejezés vagy blokk. Kizárólag függvények törzsében használható a return() függvény. Return(érték) – az adott érték a függvény visszatérési értéke. Return() – ebben az esetben NULL a visszatérési érték. Ha a függvény törzsében nem hajtódik végre egyetlen return() hívás sem, akkor a visszatérési érték a törzsben utoljára kiértékelt kifejezés értéke.

Rekurzió

A függvényekben szabadon használhatunk rekurzív hívásokat.