• Nem Talált Eredményt

SQL lek´erdez´esekhez hasonl´o feladatok - Data.table

In document Az R programozás alapjai (Pldal 37-0)

6. Adat- import´al´as, export´al´as, working directory 32

6.2. SQL lek´erdez´esekhez hasonl´o feladatok - Data.table

Ugyanezen feladatok Data.table-el val´o megold´asa:

1. FELADAT

library(readxl)

ugyfel <- read excel("ugyfel.xlsx", col types = c("numeric", "text", "text",

"date", "text"))

ugyfel2 <- read excel("ugyfel.xlsx", sheet = "ugyfel2") ugyfel$szdatum <- as.Date(ugyfel$szdatum)

str(ugyfel)

library(data.table)

ugyfelDT <- setDT(ugyfel) ugyfel2DT <- setDT(ugyfel2) 2. FELADAT

k´et oszlop kiv´alaszt´asa

szuresDT <- ugyfelDT[,.(vnev,knev)]

csak n˝ok kiv´alaszt´asa

szuresDT <- ugyfelDT[nem == "F"]

megold´as

szuresDT <- ugyfelDT[nem == "F" & szdatum <=as.Date("1950-01-01"),.(vnev,knev)]

3. FELADAT

ugyfelDT[,eletkor:= as.numeric(floor((as.Date("2018-10-10")-szdatum)/365))]

ugyfelDT[,mean(eletkor),by=nem]

R programoz´as alapjai Statisztikai alkalmaz´asokon kereszt¨ul 4. FELADAT

tablaDT <- merge(ugyfelDT, ugyfel2DT) H´any f´erfi ´es n˝oi ¨ugyf´el van?

kimutatasDT1 <- tablaDT[,.N,by=nem]

.N -speci´alis utas´ıt´as a sorok sz´am´ara

kimutatasDT2<-tablaDT[,.N,by=.(nem,igazolvanytipus id)]

kimutatasDT2[,Narany:= N/nrow(ugyfelDT)]

5. FELADAT ugyfelDT[,.N]

6. FELADAT

valtozoegyutt <- ugyfelDT[szdatum <= as.Date("1950-01-01"),.(paste(vnev, knev))]

7. FELADAT

ugyfel10DT <- ugyfelDT

ugyfel10DT <- ugyfel10DT[,ugyfeleletkorplusz10:=eletkor+10]

8. FELADAT

ugyfelPistiDT <- rbind(ugyfelDT,list(11, "Kiss","Pisti",as.Date("1990-01-01"),"M", 28 ,38))

ugyfelPisti2DT <- rbind(ugyfel2DT,list(11,"SZ" ,"123456AP" )) 9. FELADAT

ugyfelPistiDT[ugyfel id==11,szdatum:=as.Date("1991-01-01")]

ugyfelPistiDT[ugyfel id==11,eletkor:=27]

10. FELADAT

ugyfelPistiTorolveDT <- ugyfelPistiDT[ugyfel id!=11]

ugyfelPistiTorolve2DT <- ugyfelPisti2DT[ugyfel id!= 11]

Grafikus alkalmaz´asok alapjai

Az emberi ´erz´ekszervek m˝uk¨od´esi mechanizmusainak k¨ovetkezt´eben agyunk legk¨onnyebben a vi-zu´alisan megjelen´ıtett inform´aci´ot k´epes feldolgozni. Az R grafikus interf´esze kifejezetten magasan fejlett ´es felhaszn´al´obar´at, szinte kimer´ıthetetlen lehet˝os´egeket biztos´ıt az adatok kett˝o, h´arom, vagy ak´ar n´egy dimenzi´oban val´o megjelen´ıt´es´ere. Ebben a fejezetben megismerked¨unk ennek legelemibb eszk¨ozeivel.

7.1. Grafikus megjelen´ıt´es alapf ¨uggv´enyei

A legfontosabb f¨uggv´enyeket az alap´ertelmezetten telep´ıt´esre ker¨ul˝o ´es minden ind´ıt´asn´al automatiku-san bet¨olt˝od˝ographicspackage tartalmazza. Ezek egy r´esze alacsony szint˝u funkci´ot l´at el (p´eld´aul egy pontot rajzol, vagy egy vonalat h´uz egy m´ar megl´ev˝o ´abr´ara), m´asik r´esz¨uk olyan ¨osszetett fel-adatokat val´os´ıt meg, mint egy gr´af vagy egy d¨ont´esi fa megjelen´ıt´ese. Egy r¨ovid lista azokr´ol a f¨uggv´enyekr˝ol, melyeket ´erdemes fejb˝ol is ismerni:

• windows vagy plot.new : ´Uj, ¨ures ablakot nyit, ahova rajzolni lehet. A megnyitott ablakok sz´ama korl´atozva van, a jelenlegi verzi´oban 60 darabra.

• frame : Let¨orli az aktu´alis rajzot az akt´ıv ablakb´ol an´elk¨ul, hogy bez´arn´a az ablakot, ´ıgy ´uj

´abr´at rajzolhatunk r´a. F˝ok´ent akkor hasznos, ha anim´aci´ot akarunk k´esz´ıteni, melynek minden filmkock´aj´at ´ujra kell rajzolni.

• plot: Generikus f¨uggv´eny, k¨ul¨onb¨oz˝o objektumok megjelen´ıt´es´ere, p´eld´aul k´et (azonos hossz´us´ag´u) adatsort ´abr´azol egym´as f¨uggv´eny´eben, megrajzolja egy f¨uggv´eny grafikonj´at, de ak´ar egy neur´alis h´al´ot is megjelen´ıt, ha olyan objektumot adunk ´at neki.

• matplot: T¨obb adatsort ´abr´azol egyazon koordin´ata-rendszerben. Az adatokat egy m´atrix osz-lopaik´ent kell ´atadni.

R programoz´as alapjai Statisztikai alkalmaz´asokon kereszt¨ul

• curve: Egy kifejez´est (melybenxv´altoz´o szerepelhet, mint form´alis param´eter) ´abr´azol vonal-diagramk´ent. ´Allhat ¨onmag´aban, de m´ar l´etez˝o ´abr´ara is r´arajzolhatunk vele egy ´uj g¨orb´et.

• points: M´ar l´etez˝o ´abr´ara rakhatunk vele pontokat a megfelel˝o koordin´at´akra.

• abline : Az y=ax+b egyenlet˝u egyenes grafikonj´at teszi a m´ar megl´ev˝o ´abr´ara, illetve a h vagyvparam´eterek megad´as´aval v´ızszintes, illetve f¨ugg˝oleges egyenes is rajzolhat´o.

• lines: T¨or¨ottvonalat rajzol a megadott pontok ¨osszek¨ot´es´evel a m´ar megl´ev˝o ´abr´ara.

• polygon: Soksz¨oget rajzol a m´ar megl´ev˝o ´abr´ara. L´enyeg´eben ugyanaz, mint alines, csak az utols´o pontot k¨oti ¨ossze az els˝ovel, ´es ki tudja sz´ınezni a soksz¨og belsej´et is.

• segments: Hasonl´o, mint alines, csak a szakaszok kezd˝o ´es v´egpontja is megadhat´o k¨ul¨on-k¨ul¨on (alineseset´en a k¨ovetkez˝o szakasz kezd˝opontja megegyezik az el˝oz˝o v´egpontj´aval, enn´el viszont k¨ul¨on kell ˝oket megadni).

• arrows: Hasonl´o, mint asegments, csak nyilakat rajzol szakaszok helyett.

• barplot: Oszlop- vagy s´avdiagramot k´esz´ıt k¨ul¨onb¨oz˝o be´all´ıt´asokkal. K¨ul¨on, ¨ures ablakba teszi az ´abr´at.

• hist: Hisztogramot k´esz´ıt ´es alap´ertelmezetten automatikusan ´abr´azolja is.

• boxplot: ´Ertelemszer˝uen boxplotot rajzol.

• legend : Felhaszn´al´obar´at m´odon testreszabhat´o jelmagyar´azatot ad az ´abr´ahoz.

A fenti f¨uggv´enyekre mindenk´eppen ´erdemes haszn´alat el˝ott a help-ben r´akeresni, mert ezerf´elek´eppen param´eterezhet˝oek ´es nem k¨onny˝u (´es nem is ´erdemes) fejben tartani minden lehets´eges be´all´ıt´ast (meg-adhat´o a rajzolt pontok, vonalak t´ıpusa, sz´ıne stb.). Nem minden grafikus param´eter (meg-adhat´o ´at k¨ozvet-len¨ul ahigh-level f¨uggv´enyeknek, mint p´eld´aul aplotvagymatplot. Ezeket k¨ozvetlen¨ul az ´uj ablak megnyit´asa ut´an aparutas´ıt´assal lehet kiolvasni vagy ´at´ırni.

7.2. Grafikus megjelen´ıt´eshez kapcsol´od´o feladatok

Az al´abbi feladatok a 7.1 fejezetben felsorolt f¨uggv´enyek seg´ıts´eg´evel k¨onnyen megoldhat´oak. A feje-zet v´eg´en egy-egy lehets´eges megold´ast is felt¨untett¨unk.

7.2.1. Feladatok

1. FELADAT

Defini´aljunk egy 10 000 hossz´us´ag´u vektort, a (-3pi,3pi) intervallumon ´es ennek seg´ıts´eg´evel

´abr´azoljuk a sin ´es cos f¨uggv´eny grafikonj´at! Az ´abr´ara ´ırjuk r´a a f¨uggv´enyek nev´et is, mint c´ımet!

2. FELADAT

Abr´azoljuk k¨oz¨os koordin´ata-rendszerben a sin(x) ´es cos(x) f¨uggv´enyt egyszerre, k¨ul¨onb¨oz˝o´ sz´ınnel!

3. FELADAT

Defini´aljunk egy 10 000 hossz´us´ag´u vektort, a (-3pi,3pi) intervallumon ´es ennek seg´ıts´eg´evel

´abr´azoljuk a sin f¨uggv´eny pozit´ıv r´esz´et (teh´at azt a f¨uggv´enyt, ami sin(x)–szel egyenl˝o, ha ez pozit´ıv ´es null´aval egyenl˝o, amikor sin(x) negat´ıvba megy)!

4. FELADAT

´Irjunk k´odot, ami elk´esz´ıti a k¨ovetkez˝o ´abr´at:

−1.0 −0.5 0.0 0.5 1.0

−1.0−0.50.00.51.0

R programoz´as alapjai Statisztikai alkalmaz´asokon kereszt¨ul 5. FELADAT ´Irjunk k´odot, ami elk´esz´ıti a k¨ovetkez˝o ´abr´at:

−1.0 −0.5 0.0 0.5 1.0

−1.0−0.50.00.51.0

7.2.2. Megold´asok

1. Feladat

x <- seq(-3*pi,3*pi,length.out = 10000) windows(20,8); par(mfrow=1:2);

plot(x,sin(x), main = "szinusz", type = "l");

plot(x,cos(x), main = "koszinusz", type = "l") 2. Feladat

x <- seq(-3*pi,3*pi,length.out = 10000)

windows(10,6);matplot(x,cbind(sin(x),cos(x)), type = "l", lty = 1) 3. Feladat

x <- seq(-3*pi,3*pi,length.out = 10000) y <- sin(x);

y[y < 0] <- 0;

windows(10,6);

plot(x,y)

vagy egyszer˝ubben:

windows(10,6) plot(x,pmax(y,0)) 4. Feladat

x <- seq(-1,1,length = 1000)

matplot(x,cbind(1-abs(x), abs(x)-1), typ = "l", lwd = 2, col = 4, lty = 1, xlab

= "", ylab = "") vagy

windows()

plot(NA, xlim=c(-1,1), ylim=c(-1,1)) polygon (c(-1,0,1,0), c(0,-1,0,1)) 5. Feladat

x <- seq(-1,1,length = 1000)

matplot(x,cbind(sqrt(1-x^2),-sqrt(1-x^2),-sqrt(0.3-x^2)-0.1), typ = "l", lwd

= 2, col = 2, lty = 1, xlab = "", ylab = "")

points(c(-0.25,0.25),c(0.4,0.4),pch = 20, col = 2)

8. fejezet

Algoritmusok ´es vez´erl´esi szerkezetek

Algoritmus alatt – hogy ne vessz¨unk el a matematikai absztrakci´o ´utveszt˝oiben – sz´am´ıt´og´eppel me-chanikusan v´egrehajthat´o utas´ıt´assorozatot ´ert¨unk. Hogy a kicsit sem prec´ız defin´ıci´oval is dolgozni tudjunk, meg kell hat´aroznunk, hogy a sz´am´ıt´og´ep milyen utas´ıt´asok v´egrehajt´as´ara k´epes. Ehhez j´o szeml´elet a k¨ovetkez˝o. Adott egy v´eges sok elemb˝ol ´all´o lista, elemei megsz´amozva 1-t˝ol n-ig. A lista mindegyik eleme a k¨ovetkez˝o utas´ıt´asok valamelyik´et tartalmazhatja:

• Valamilyen egyszer˝u aritmetikai m˝uvelet, azaz k´et vagy t¨obb sz´ammal n´egy alapm˝uveletb˝ol (esetleg gy¨okvon´asb´ol) fel´ep´ıthet˝o algebrai kifejez´es kisz´am´ıt´asa ´es elt´arol´asa egy v´altoz´oba. A kifejez´es tartalmazhatja kor´abban kisz´amolt r´eszfeladatok v´egeredm´eny´et is, melyet egy kor´abbi l´ep´esben l´etrehozott v´altoz´oban t´aroltunk.

• Egy egy´ertelm˝uen eld¨onthet˝o a<b vagy a≤b alak´u matematikai rel´aci´o ki´ert´ekel´ese (annak eld¨ont´ese, hogy igaz vagy hamis az ´all´ıt´as), ahol a ´es b egy-egy kor´abban kisz´amolt v´altoz´o (vagy m´ar el˝ore adott input adat), ´es ugr´as a lista egy adott sorsz´am´u utas´ıt´as´ara, amennyiben az

´all´ıt´as igaz.

• STOP vagy EXIT utas´ıt´as ´es opcion´alisan egy visszat´er´esi ´ert´ek, output, aminek a kisz´amol´as´ara az algoritmusa l´etrej¨ott.

A sz´am´ıt´og´ep az algoritmus futtat´asa sor´an mindig a lista elej´en kezdi a program v´egrehajt´as´at, ´es akkor ´all le, ha kil´ep´esi pontra ´er, vagy a lista utols´o elem´ere, ha ez nem tartalmaz olyan utas´ıt´ast, hogy egy kor´abbi pontra kell visszaugrani. Az algoritmus alap´ertelmezetten mindig a k¨ovetkez˝o utas´ıt´asra ugrik, ha m´ashov´a val´o ugr´asra nincs utas´ıt´as az adott pontban.

A sz´am´ıt´og´ep teh´at k´epes aritmetikai m˝uveleteket ´es ¨osszehasonl´ıt´ast v´egezni, vagyis ki tudja sz´amolni, hogy 2+2 =4, ´es az 5 ≤7 k´erd´esre k´epes megv´alaszolni, hogy TRUE. ´Altal´aban azt a probl´em´at tekintj¨uk algoritmikusan megoldhat´onak, amelyre fel tudunk ´ırni egy ilyen egyszer˝u k´erd´esekb˝ol

´es utas´ıt´asokb´ol ´all´o v´eges hossz´u sorozatot.

A k¨ovetkez˝o algoritmus Donald Knut Art of Computer Programming c´ım˝u k¨onyv´enek bevezet˝oj´eben tal´alhat´o, arr´ol, hogyan kell a k¨onyvet elolvasni:

B´armilyen primit´ıvnek is t˝unik a fenti ”defin´ıci´o”, a sz´am´ıt´og´epek enn´el (sokkal) t¨obbet nem tud-nak. A manaps´ag sokat hangoztatott machine learning, mesters´eges intelligencia, g´epi tanul´as ´es hasonl´o ”fancy” kifejez´esek nem a sz´am´ıt´og´epek k´epess´egeinek, hanem az ˝oket programoz´o alkot´o emberi szellemnek a megtestes¨ul´esei.

Emellett ´erdemes itt megjegyezni, hogy noha az els˝o sz´am´ıt´og´epek megalkot´asa ´ota a sz´am´ıt´asi ka-pacit´as a t¨obbsz¨or¨os´ere (t¨obb ezerszeres´ere) n˝ott, a sz´am´ıt´og´epek alapvet˝o k´epess´egei nem v´altoztak.

Magyarul: a sz´am´ıt´og´ep nem tud t¨obbet, mint amennyit a hatvanas ´evekben tudott, csak az egys´egnyi helyre zs´ufolhat´o tranzisztorok sz´am´anak rohamos n¨oveked´es´evel gyorsabban ´es t¨obb adattal k´epes ugyanazt kisz´amolni. Ez term´eszetesen csak a sz´am´ıt´og´ep fizikai tulajdons´agaira vonatkozik, algo-ritmusok l´etezhetnek ´es l´eteznek is olyanok, amik ¨otven (vagy ¨ot) ´evvel ezel˝ott nem voltak, teh´at a szoftverek nyilv´an folyamatosan fejl˝odnek.

R programoz´as alapjai Statisztikai alkalmaz´asokon kereszt¨ul Az emberi szem/agy sz´am´ara k¨onnyebben ´ertelmezhet˝o egy algoritmus, ha ´un. flow diagrammal szeml´eltetj¨uk. Az Art of Computer Programming-ban l´ev˝o algoritmus grafikusan megjelen´ıtve ´ıgy fest:

Egy algoritmus teh´at inputadatokb´ol, v´eges sok elemi utas´ıt´asb´ol ´es azok (bizonyos felt´etelekt˝ol f¨ugg˝o) v´egrehajt´asi sorrendj´ere vonatkoz´o szab´alyokb´ol ´all.

Egy algoritmus egy ´altal´anos l´ep´ese teh´at vagy egy elemi utas´ıt´as, vagy egy felt´etel teljes¨ul´es´et˝ol f¨ugg˝oen ugr´as az algoritmus egy m´asik pontj´ara. Az ilyen l´ep´esekb˝ol ´all´o utas´ıt´assorozatok le is prog-ramozhat´ok, ugyanis a sz´am´ıt´og´ep processzora is ilyen utas´ıt´asok v´egrehajt´as´ara k´epes.

A programoz´as (h)˝oskor´aban ezt val´oban ´ıgy is csin´alt´ak, azonban a modern programoz´asi nyelvek jelent˝os r´esze nem tartalmazza ezt az ´un. GoTo t´ıpus´u utas´ıt´ast, mely m´aig par´azs vit´ak t´argy´at k´epezi,

´es egyes v´eleked´esek szerint t´ul vesz´elyes az ´atlag programoz´onak.

Egy ilyen algoritmus ´ır´asakor val´oban kiemelt figyelmet kellett ford´ıtani arra, hogy a r´eszfeladatok megold´as´an´al ne ´ırjunk olyan mem´oriater¨uletre, amelyen m´eg fontos adat tal´alhat´o, az algoritmus min-den pontj´an rendelkez´esre ´alljon az az adat, amire ´eppen sz¨uks´eg¨unk van, illetve minmin-den lehets´eges kimenetel eset´en egy´ertelm˝uen megadjuk, mi a teend˝oje a programnak. Ennek m´elyebb t´argyal´as´aba nem bocs´atkozunk, az ´erdekl˝od˝oknek javasoljuk Edgar Dijkstra: Go To Statement Considered Harmful

c´ım˝u ´ır´as´at.

8.1. Algoritmusok ´ep´ıt˝ok¨ovei

A programok jobban ´attekinthet˝ov´e ´es k¨onnyebben ´ertelmezhet˝ov´e v´alnak, ha nem engedj¨uk meg tetsz˝oleges flow chart haszn´alat´at egy probl´ema le´ır´as´ara, hanem csak speci´alis szerkezet˝u gr´afokat haszn´alunk f¨ol. Letiltjuk teh´at az algoritmusok ´ır´asa sor´an az olyan utas´ıt´as haszn´alat´at, mely a prog-ram utas´ıt´asait tartalmaz´o lista adott sorsz´am´u elem´ere val´o ugr´ast eredm´enyezi (GoTo). Ennek az

¨ossze-vissza ugr´algat´asnak a lehet˝os´ege a program egy random pontj´ara t´ul sok hiba forr´asa. Mi az az utas´ıt´ask´eszlet, amit felt´etlen¨ul meg kell tartanunk ahhoz, hogy legyen es´ely¨unk b´armit is leprogramoz-ni? Pr´ob´aljuk meg sora venni:

Szekvencia A sz´am´ıt´og´ep a program utas´ıt´asait tartalmaz´o lista elemein alap´ertelmezetten elej´et˝ol a v´eg´eig sorban megy v´egig. Teh´at egyszer˝u utas´ıt´asok (line´aris) sorozat´at egy algoritmus nyilv´an mindenk´eppen tartalmazza.

Felt´eteles el´agaz´as (selection) Ahhoz, hogy egy program ne minden inputra pontosan ugyanazt az eredm´enyt hozza ki, nyilv´an sz¨uks´eges, hogy az algoritmus fut´asa sor´an egyes pontokon valamely felt´etelt˝ol f¨ugg˝oen d¨onthessen, hogy k´et adott utas´ıt´as k¨oz¨ul az egyiket vagy a m´asikat akarja-e v´egrehajtani. Ez azt jelenti, hogy egy felt´etelt˝ol f¨ugg˝oen a program k´etfel´e ´agazik, a k´et ´ag k¨oz¨ul pontosan az egyik hajt´odik v´egre, majd a k´et ´ag ism´et egyes¨ul, ´es ezen a ponton folytat´odik a program fut´asa.

Iter´aci´o A szekvencia ´es az el´agaz´as m´eg nem teszi lehet˝ov´e olyan program ´ır´as´at, mely t¨obb utas´ıt´ast hajt v´egre, mint amilyen hossz´u. Egy algoritmus tervez´ese sor´an gyakori eset, hogy ugyanazt az egy utas´ıt´ast kell sokszor, k¨ozvetlen¨ul egym´as ut´an megism´etelni, eg´eszen addig, am´ıg valamely felt´etel nem teljes¨ul. Ezt nevezz¨uk iter´aci´onak: egy adott utas´ıt´asokb´ol ´all´o blokk v´egrehajt´asa mindaddig, am´ıg egy v´altoz´o ´ert´eke igaz. Ez teh´at k´et nagyon speci´alis GoTo utas´ıt´asnak felel meg. Az els˝o el˝osz¨or ellen˝orzi egy felt´etel teljes¨ul´es´et, ´es ha az nem teljes¨ul, akkor el˝oreugrik a programban, azaz kihagy egy n´eh´any utas´ıt´asb´ol ´all´o blokkot. Ha a felt´etel teljes¨ul, akkor ez az utas´ıt´asokb´ol ´all´o blokk v´egrehajt´odik ´es ennek az utols´o utas´ıt´asa, hogy ugorjon vissza a blokk el´e a felt´etel ellen˝orz´es´enek hely´ere (´es ism´etelje meg az eg´eszet).

R programoz´as alapjai Statisztikai alkalmaz´asokon kereszt¨ul A modern programoz´asi nyelvek nagy r´esze a GoTo utas´ıt´as helyett ennek a h´arom speci´alis szer-kezetnek a haszn´alat´at teszi lehet˝ov´e. Ennek l´etjogosults´ag´at az al´abbi matematikai eredm´eny adja:

T´etel(Structured program theorem - B¨ohm-Jacopini, 1966). Minden algoritmus megval´os´ıthat´o olyan flow chart-tal is, mely csup´an a fenti h´arom ´un. vez´erl´esi szerkezetet tartalmazza.

A t´etel szerint b´armilyen bonyolult diagram ´ırja is le egy algoritmus megold´as´at, megadhat´o egy azzal ekvivalens diagram, mely csup´an ezt a h´arom szerkezetet kombin´alja:

A t´etelt ´ugy kell ´erteni, hogy az algoritmust le´ır´o flow chart kiz´ar´olag ilyen szerkezeteket tartalmaz tetsz˝oleges m´elys´egben egym´asba ´agyazva.

8.2. Vez´erl´esi szerkezetek R-ben

A legt¨obb ma haszn´alt programoz´asi nyelv a B¨ohm-Jacopini-t´etel szerinti szerkezeteket megval´os´ıt´o nyelvi elemeket ´es n´eh´any plusz ”k´enyelmi funkci´ot” tartalmaz. A t´etel szerint b´armely k´et progra-moz´asi nyelv, amely ezt a h´arom elemet tartalmazza, ekvivalens abban az ´ertelemben, hogy pontosan ugyanazokat a dolgokat tudj´ak kisz´amolni (vannak probl´em´ak, amiket sz´am´ıt´og´eppel egy´altal´an nem lehet megoldani). Ez azt is jelenti, hogy az egyes programoz´asi nyelvek k¨ozti k¨ul¨onbs´eg (kis t´ulz´assal) csup´an eszt´etikai k´erd´es, a vel¨uk megoldhat´o probl´em´ak k¨ore pontosan ugyanaz. Az R-ben a ?Control utas´ıt´as be´ır´as´aval ´erhetj¨unk el a vez´erl´esi szerkezetek le´ır´as´at.

8.2.1. A B¨ohm-Jacopini-t´etel szerinti utas´ıt´ask´eszlet

1. A szekvenci´alis programfuttat´as mag´at´ol ´ertet˝od˝o, a forr´ask´odban l´ev˝o utas´ıt´asok alap´ertelmezetten egym´as ut´an, azaz f¨ontr˝ol lefel´e, ezen bel¨ul balr´ol jobbra hajt´odnak v´egre, ehhez semmilyen

vez´erl´esi szerkezetre nincsen sz¨uks´eg. R-ben minden utas´ıt´as v´eg´ere pontosvessz˝ot kell tenni, vagy ´uj sort kezdeni, ezen k´ıv¨ul semmi speci´alis tudnival´o nincs.

2. A felt´eteles el´agaz´as tal´an minden programoz´asi nyelvben megtal´alhat´o, ´es ´altal´aban hasonl´oan m˝uk¨odik.

Szintaktik´aja R-ben:

if(cond) expr, illetve if(cond) cons.expr else alt.expr

Az utas´ıt´as eredm´enye, hogy a felt´etel (cond) ki´ert´ekel˝od´ese ut´an a k´et egym´ast kiz´ar´o utas´ıt´as k¨oz¨ul az els˝o hajt´odik v´egre (vagyis a cons.expr kifejez´es ´ert´ekel˝odik ki), ha a felt´etel igaz, ´es a m´asodik (opcion´alis, azaz elhagyhat´o, alternat´ıv felt´etel, vagyis alt.expr), ha hamis. A felt´eteles el´agaz´asn´al nem k¨otelez˝o a kapcsos z´ar´ojelek haszn´alata, erre csak akkor van sz¨uks´eg, ha vala-melyik ´agban t¨obb utas´ıt´ast akarunk v´egrehajtani.

x <- 4

if (x < 5) print("kicsi") else print("nagy")

Vigy´azzunk, hogy logikai felt´etelk´ent olyan kifejez´es is ´ertelmezhet˝o, amir˝ol ez els˝ore nem tri-vi´alis. A k¨ovetkez˝o k´od p´eld´aul hiba n´elk¨ul lefut:

x <- "n´egy"

if (x < 5) print("kicsi") else print("nagy")

Ha a ki´ert´ekelend˝o felt´etel logikai ´ert´ekk´ent nem ´ertelmezhet˝o, akkor a program hiba¨uzenettel le´all. Pr´ob´aljuk ki ezt is:

x <- NA

if (x < 5) print("kicsi") else print("nagy")

Ha a ki´ert´ekelend˝o felt´etel egyn´el hosszabb, akkor csak az els˝o komponens´et veszi figyelembe,

´es err˝ol warning-ot dob, de nem fut hib´ara.

x <- 1:6

if (x < 5) print("kicsi") else print("nagy")

R programoz´as alapjai Statisztikai alkalmaz´asokon kereszt¨ul 3. Az iter´aci´ot megval´os´ıt´o vez´erl´esi szerkezet szintaktik´aja:

while(cond) expr

Ez mindaddig folytatja az expr kifejez´es ki´ert´ekel´es´et, am´ıg a cond felt´etel igaz. A haszn´alata csak akkor sz¨uks´eges, ha a kifejez´es ¨osszetett. N´ezz¨unk egy p´eld´at :

a <- 137

while(a != 1) if(a%%2 == 0) print(a <- a/2) else print(a <- 3*a+1)

Induljunk ki egy tetsz˝oleges term´eszetes sz´amb´ol, majd ism´etelj¨uk a k¨ovetkez˝oket: ha a sz´am p´aros, elosztjuk kett˝ovel, ha p´aratlan, megszorozzuk h´arommal ´es hozz´aadunk egyet; ez lesz az ´uj sz´am. (A dupla %% oper´ator az els˝o sz´am m´asodik szerinti oszt´asi marad´ek´at sz´amolja ki.) Majd ism´et, ha az ´uj sz´am p´aros, osztjuk kett˝ovel, ha p´aratlan, szorozzuk h´arommal ´es hozz´aadunk egyet. Ezt folytatjuk. Akkor ´allunk le, ha el´erj¨uk az 1-et. Az iter´aci´ok sz´am´at nem tudjuk el˝ore megmondani, csak az aktu´alis sz´amr´ol tudjuk ellen˝orizni, hogy egyenl˝o-e 1-gyel. A print utas´ıt´as csak az´ert kell, hogy l´assuk a sorozat tagjait.

Noha a t´etel szerint a fenti h´arom utas´ıt´as haszn´alat´aval b´armit le lehet programozni (m´armint, amit egy´altal´an le lehet), gyakran ad´odik olyan helyzet, amihez egy speci´alis (egyszer˝ubb) utas´ıt´as biz-tons´agosabb, kevesebb hibalehet˝os´eget rejt, vagy csak k´enyelmesebb, esetleg k¨onnyebben ´ertelmezhet˝o, ha k´es˝obb r´a kell j¨onni a k´od logik´aj´ara. Az R-ben is van n´eh´any ilyen utas´ıt´as.

8.2.2. Speci´alis vez´erl´esi szerkezetek

1. Az iter´aci´o legfontosabb ´es leggyakoribb speci´alis esete, amikor a ciklusmag egy el˝ore ismert, v´eges halmaz elemeivel param´eterezhet˝o (term´eszetesen a ciklusmagnak nem sz¨uks´eges val´oban f¨uggnie ett˝ol a param´etert˝ol). Erre a speci´alis esetre R-ben k¨ul¨on utas´ıt´as van, melynek szintak-tik´aja:

for (var in SEQ){ <utas´ıt´asok> }

Afor´esinkulcsszavakat az RStudio k´ekkel kiemeli, az els˝o ov´alis z´ar´ojel k¨otelez˝o elem, a blok-kot megad´o kapcsos{ }z´ar´ojel opcion´alis, csak akkor van r´a sz¨uks´eg, ha a blokk t¨obb utas´ıt´asb´ol

´all. A var tetsz˝oleges form´alis param´eter, amely lehet kor´abban m´asra haszn´alt v´altoz´on´ev, de lehet olyan is, melyet kor´abban nem defini´altunk. ASEQegy kifejez´es, amelynek ´ert´eke egy vek-tor, m´atrix vagy lista (data.frame-et is bele´ertve), vagy b´armely bonyolultabb objektum, melynek elemein v´egig lehet menni (lehet egyetlen elem˝u, de ak´ar ¨ures is). Ha ez egy v´altoz´on´ev, akkor a v´altoz´ot el˝otte l´etre kell hozni, de lehet egy f¨uggv´enyh´ıv´as is, mely egy megfelel˝o objektumot ad vissza. Ilyen egyszer˝u iter´aci´o p´eld´aul, hogy ´ırjuk ki a sz´amokat egy adott intervallumb´ol:

´all. A var tetsz˝oleges form´alis param´eter, amely lehet kor´abban m´asra haszn´alt v´altoz´on´ev, de lehet olyan is, melyet kor´abban nem defini´altunk. ASEQegy kifejez´es, amelynek ´ert´eke egy vek-tor, m´atrix vagy lista (data.frame-et is bele´ertve), vagy b´armely bonyolultabb objektum, melynek elemein v´egig lehet menni (lehet egyetlen elem˝u, de ak´ar ¨ures is). Ha ez egy v´altoz´on´ev, akkor a v´altoz´ot el˝otte l´etre kell hozni, de lehet egy f¨uggv´enyh´ıv´as is, mely egy megfelel˝o objektumot ad vissza. Ilyen egyszer˝u iter´aci´o p´eld´aul, hogy ´ırjuk ki a sz´amokat egy adott intervallumb´ol:

In document Az R programozás alapjai (Pldal 37-0)