Az R programozási nyelv

Típusok, típuskonstrukciók

Objektumok

Az R nyelvben nincsen lehetőség közvetlen memória elérésre, s minden adatszerkezetet objektumként kezel. Ezekre az objektumokra szimbólumokon vagy változókon keresztül hivatkozhatunk. Néhány példa az objektumokra: vektorok, listák, NULL objektum, kifejezés objektumok, szimbólumok, függvények...

Objektumok típusa, konverziók

A typeof(x) függvény visszaadja az argumentumként kapott objektum típusát (karakterláncban). Logikai visszatérési értékű függvényekkel is vizsgálhatjuk az objektum típusát, mint például: is.logical(x), is.integer(x), is.double(x), is.numeric(x), is.list(x), is.function(x), ...

A típusok között elég szabad átjárás van. A kifejezések kiértékelése során automatikus a típuskonverzió. A típuskonverziók kényszerítésére számos konverziós függvény áll rendelkezésre, például: as.logical(x), as.integer(x), as.list(x), as.function(x), as.symbol(x), ...

Alaptípusok

Vektor objektum

A legalapvetőbb fajta objektumok a vektorok. Folytonosan elhelyezkedő elemekből állnak, amelyekhez indexeléssel lehet hozzáférni. Nincsenek a vektornál egyszerűbb objektumok, a konstansok egyelemű vektorok

Legegyszerűbb esetben a vektorok azonos típusú elemekből állnak, ezek az úgynevezett atomi vektorok, amelyeknek 6 fajtája van: logikai, egész, valós, komplex, karakter, bináris. Vektorokat a c(...) függvénnyel lehet létrehozni. Ez közös típusra konvertálja és egyetlen vektorrá fűzi össze az argumentumokat.

Példa vektorok létrehozására:
c("X","Y","Z") eredmény: "X" "Y" "Z"
c(c(1,2),3,c(4,5)) eredmény: 1 2 3 4 5
c(0i,TRUE,2) eredmény: 0+0i 1+0i 2+0i

Vektorok bárhol előfordulhatnak aritmetikai kifejezésekben, ekkor a műveletek elemenként lesznek végrehajtva (van néhány speciális művelet, mely kivétel). Az aritmetikai függvények vektorokra alkalmazása is elemenkénti alkalmazást jelent. Nagyon komplex kifejezéseket nagyon tömören le lehet írni ilyen módon.

Vektorok indexelése:az x vektor indexelése x[i] vagy x[[i]] módon történhet, ahol az i index egész, valós, logikai vagy karakter típusú lehet. A [] operátorral egyidejűleg több elemet is ki lehet választani. Ha az index negatív egészekből álló vektor, akkor azokat az elemeket adja meg, amelyeket nem kell kiválasztani. Numerikus indexek esetén a nem egész értékek egésszé konvertálódnak. Az index lehet karakter típusú, ekkor a names attribútum alapján történik az adott nevű elem kiválasztása.

NULL objektum

Egy objektum hiányának jelzésére használható. Gyakran ez jelzi, ha egy kifejezés vagy függvény értéke nem definiált. Nincsen típusa és nem lehet az attribútumait beállítani. Egyetlen NULL objektum létezik.

Szimbólumok

A szimbólumok objektumokra hivatkoznak. Az objektumok neve általában szimbólum. Az as.symbol(x) vagy as.name(x) függvénnyel lehet létrehozni szimbólum objektumokat (az argumentum egy karakterlánc lehet). Az is.symbol(x) és is.name(x) függvények visszaadják, hogy az argumentum szimbólum objektum-e. A typeof() függvény "symbol" értéket ad, ha az argumentuma szimbólum objektum.

Kifejezés objektumok

A kifejezések egy vagy több utasításból állnak, ahol az utasítások szintaktikailag helyes, tokenekből – például literálokból, kulcsszavakból, operátorokból – álló konstrukciók. A kifejezés objektumok nem kiértékelt kifejezéseket tartalmaznak, egyidejűleg akár többet. Az expression(...) függvénnyel lehet kifejezés objektumokat létrehozni. Az eval(kifejezés) függvénnyel végezhető el az argumentumként adott kifejezés objektum kiértékelése. Meg lehet adni argumentumként azt a környezetet is, amelyben a kiértékelést el kell végezni (ha nem adjuk meg, akkor a hívás helyének környezetét használja a függvény). Ha a kifejezés objektum több kifejezést tartalmaz, valamennyi kiértékelése, és az utolsó értéke a függvény visszatérési értéke.

Összetett objektumok

Listák

A direkt-szorzat típus megvalósítása. Olyan vektorok, amelyeknek az elemei tetszőleges típusú objektumok lehetnek. A listák rekurzív jellegű objektumok, az elemeik lehetnek listák. Az elemekhez hozzáférés indexeléssel történik, a vektorokhoz hasonlóan.

Listákat a list(...) függvénnyel lehet létrehozni. Tetszőleges számú argumentumot lehet a függvénynek adni, amelyek az elemeket adják meg. Az elemeket meg lehet adni név=érték módon, ahol név az elem nevét adja meg, ezek alkotják majd a names attribútum értékét. Ha egy elemhez nem adunk meg nevet, akkor a names attribútum értékében a megfelelő elem "" lesz. Ha egyetlen elemhez sem adunk meg nevet, akkor a names attribútum értéke NULL lesz. A függvényt argumentum nélkül meghívva az eredmény üres lista.

Az unlist(x) függvénnyel lehet listákat egyszerűsíteni. A függvény a lista elemeit rekurzívan feldolgozva egy atomi vektort próbál konstruálni az alkotó elemekből. Ez akkor nem sikerül, ha a lista elemei között nem vektor jellegű elemek – például olyan nyelvi elemek, mint a szimbólumok – szerepelnek. Az utóbbi esetben a visszatérési érték egy olyan lista, amelyben végrehajtásra kerültek az elvégezhető egyszerűsítések.

Listák indexelése: a vektorok indexelésénél elmondottak vonatkoznak a listákra is. Azonban használható indexelésre a $ operátor, x$index módon (az index karakterlánc vagy szimbólum lehet).

Faktorok

A faktorok olyan speciális vektor jellegű objektumok, amelyek velük azonos hosszú vektorok elemeinek egy diszkrét osztályozását határozzák meg.

Adatkeretek

Olyan speciális listák, amelynek a komponensei azonos hosszúak. A komponensek vektorok, listák (más adatkeret objektumok is), faktorok és mátrixok lehetnek. Olyan mátrix-szerű struktúrákként tekinthetünk rájuk, amelyekben az oszlopok különböző típusúak lehetnek, és amelyekben az oszlopokat a lista komponensei adják meg.

Példa:
countries <- data.frame(
name=c("Hungary", "Chile", "Japan"),(
area=c(93030, 756950, 377835),(
oecd.member=c(TRUE, FALSE, TRUE),(
population=c(9981334, 16134219, 127463611),(
capital=I(c("Budapest", "Santiago", "Tokyo")),(
row.names="name")

Objektumok attribútumai

A NULL objektum kivételével minden objektumnak lehetnek attribútumai. Az attribútumok az objektumokhoz tartozó név-érték párok. Az attribútumokat olyan listákban tárolják, amelyekben az elemek nevei az attribútumok nevei. Az attribútumok neve azonosító, értékük tetszőleges objektum lehet (vannak olyan attribútumok, amelyeknek speciális jelentése van, ezek értéke megfelelő kell hogy legyen). Az attributes(x) függvénnyel lehet lekérdezni az argumentumként adott objektum attribútumait (a visszatérési érték az attribútumok listája). Az attr(x, név) függvénnyel lehet lekérdezni egy adott nevű attribútum értékét.

Mód és tárolási mód

A mode(x) és storage.mode(x) függvények visszaadják az argumentumként kapott objektum S nyelvvel kompatibilis módját illetve tárolási módját. A két függvény gyakran ugyanazt az értéket adja. A visszaadott érték a typeof(x) függvény által szolgáltatott típustól függ.

Names

Lehetővé teszi vektorok, listák elemeinek megcímkézését. Az objektumok kiírásánál az elemek az attribútum értéke alapján lesznek megcímkézve. Indexelésnél lehet a címkéket használni indexként. Az attribútum értéke egy megfelelő hosszú karakter vektor. A names(x) függvény használható a names attribútum értékének lekérdezésére.

Dimenziók, dimnames

A dim attribútim segítségével implementálhatunk tömböket. A tömb tartalmát egy vektorban tároljuk, s a dim attribútum - mely egészeket tartalmazó vektor - adja meg az egyes dimenziók hosszát. Az R gondoskodik róla, hogy a length(x) függvény hívása esetén az x objektum helyes hosszát adja vissza.

A tömböknél elnevezhetjük az egyes dimenziókat, a dimnames attribútum használatával, mely karaktersorozat vektorok listája.

Class

Az R osztály-rendszerét a class attribútumokon keresztül lehet kezelni. Az attribútum egy karaktersorozat vektor, mely azon osztályok listáját tartalmazza, melyektől az objektum származik. Ezen alapszik az R generikus metódusainak a működése.

Kifejezések, operátorok és kiértékelésük

Ahogy az előzőekben leírtuk, a kifejezések is objektumok, melyek kiértékelése az argumentumok precedencia sorrendjének megfelelően történeik.

Konstansok

A konstansok egyelemű vektorok. Négy fajtájuk van: logikai, numerikus, komplex, karakterlánc. További négy speciális konstans van: NULL, NA, Inf, NaN.

Logikai konstansok: TRUE és FALSE. Numerikus konstansok: előjel nélküliek és valós típusúak. Komplex konstansok: decimális numerikus konstans után 'i' karakter, továbbá nincs valós rész, csak képzetes. Karakterlánc konstansok: megadásuk ' vagy " karakterek között.

NA: hiányzó értéket jelöl, NA értéken végzett műveletek eredménye általában NA. Inf: végtelen jelölése. Minden matematikai függvénynél megjelenhet bemenetként és eredményként pozitív vagy negatív Inf érték. NaN: Not A Number. Valós típusú, más típusra konvertáláskor az eredmény NA. Minden matematikai függvénynél megjelenhet bemenetként és eredményként.

Változók és elérhetőségük

Az R a "lexical scoping" modellt használja, mely megengedi azonos név használatát különböző objektumok azonosítására. Ennek kezelését a környezet objektumokkal oldották meg. A környezeteket egy szimbólum-érték párokat tartalmazó úgynevezett keret alkotja, valamint egy mutató a befoglaló környezetre. A környezetek faszerkezetet alkotnak. A környezetek kezelése automatikusan történik (például minden függvényhívás során automatikusan létrejön egy környezet, amely a függvény lokális változóit tartalmazza). Vannak azonban környezetek kezelésére szolgáló függvények is.

Egy szimbólum értékének meghatározása közben, ha egy környezet nem tartalmazza a szimbólumot, a keresés a befoglaló környezetben folytatódik. A legkülső, az úgynevezett globális környezet a felhasználó munkaterülete. Minden parancssorban elvégzett értékadás a globális környezetben hozza létre a megfelelő objektumot. Ha egy szimbólumkeresés sikertelen volt, akkor a keresési útvonalban adott környezetekben folytatódik a keresés. A keresési útvonal első eleme a globális környezet, utolsó eleme pedig mindig a base csomag.

Operátorok

Az R nyelv számos operátort tartalmaz, melyek precedencia szintje előre definiált. A zárójelezéssel ezen változtathatunk. Az operátorok balról jobbra asszociatívak (kivétel: ^, <-, = és <<-). A felhasználó is definiálhat infix binér operátorokat, ezek formája %jeloles%.

Aritmetikai operátorok: binér aritmetikai műveleteknél az eredmény komplex, ha az egyik vagy mindkét operandus komplex típusú; valós, ha az egyik vagy valamelyik operandus valós típusú; egész, ha mindkét operandus egész típusú, a ^ és / operátorok kivételével, amelyek minden esetben valós eredményt adnak. Az operandusok lehetnek logikai típusúak, amelyek automatikusan egész típusúvá lesznek konvertálva. Az aritmetikai operátorok vektorokra alkalmazása elemenkénti alkalmazást jelent.

Logikai operátorok: a logikai operátorok automatikusan logikai típusúvá konvertálják az operandusokat. Numeric típusú értékek konvertálásakor minden nullától különböző érték TRUE lesz, a 0 pedig FALSE. Bináris vektorok esetében a !, & és | operátoroknál nincs konverzió, a műveletek bitenkénti műveleteket jelentenek. A ! operátor elemenkénti negációt jelent. Az & és | operátorok az elemenkénti logikai ÉS illetve logikai VAGY műveletet jelentik. Az && és || operátorok rövidzár logikai műveletek, amelyek kizárólag az operandusok első elemeit használják fel.

Relációs operátorok: Jelentésük a megszokott: karakterláncok hasonlítása lexikografikus rendezés szerint. Az operandusok elemenkénti összehasonlítása. Legalább az egyik operandus atomi vektor kell hogy legyen. Az if és while utasításokban – amelyekben a feltétel egyetlen logikai érték kell hogy legyen – kerülni az == és != operátorok használatát, amelyek végrehajtása elemenként történik. Használjuk az identical(x, y) függvényt, amely TRUE értéket ad vissza, ha a két argumentum azonos, egyébként pedig FALSE értéket. Gyakran még hasznosabb a megengedőbb isTRUE(all.equal(x, y)) függvény.