# programmeringsspraaket r har i seg en del funksjoner # som ikke krever en 'require' til aa begynne med. # pakken som heter grid hentes inn ved 'require grid' # og denne er svaert sentral i mye bruk av R, men # det er andre veier til grafikk ogsaa. # her er et eksempel som ikke krever noen 'require' # aller foerst. dette er en 'pie chart', og istedenfor # at vi bruker en funksjon for aa lage 'tilfeldige' # data, settes dataene i foerste linje: pie.sales <- c(0.4, 0.2, 0.1, 0.26, 0.28, 0.155) names(pie.sales) <- c("Green PC's", "Blue PC's", "Purplered PC's", "Cornsilk PC's", "Cyan PC's", "Black PC's") pie(pie.sales, col = c("green","blue","violetred1","cornsilk","cyan","black")) title(main = "Predicted PC Sales", cex.main = 1.8, font.main = 1) title(xlab = "Compared with ex poste", cex.lab = 0.8, font.lab = 3) Her brukes en tilfeldighetsgenerator to ganger, og vi har to forskjellige kurver med mange tall, der mellomrommet mellom dem farvelegges: par(bg="white") n <- 100 x <- c(0,cumsum(rnorm(n))) y <- c(0,cumsum(rnorm(n))) xx <- c(0:n, n:0) yy <- c(x, rev(y)) plot(xx, yy, type="n", xlab="Factor 1", ylab="Factor 2") polygon(xx, yy, col="green") title("A distance plot") # fordelen ved at vi bruker funksjoner der ikke alt er spesifisert # paa forhaand er at vi i stoerre grad har kontakt med tallene og # vet hva som skjer paa skjermen, vet hvordan regulere det i # forhold til tallene. samtidig er det greit aa vite at det # finnes pakker der mye er ferdigskrevet, som kan kalles paa; # og hvis vi bygger opp en kompetanse knyttet til en av disse # pakkene, kan vi oppnaa et foerste-haands forhold til dataene # der ogsaa. # det kan vaere greit at vi har et komplisert eksempel naa -- som # viser muligheter som strengt tatt ikke er noedvendige for aa # lage grafer til utprinting for statstistisk analyse sammen med # tall som man har samlet til -- noe som er hovedmaalsettingen # med dette utvalg av eksempler, og disse kommentarerene, ikke minst # til studentbruk, men ogsaa for bruk i jobbsammenheng. # dette kompliserte eksempel bruker ikke bare en, men tre 'require' # i begynnelsen. det har funksjoner med funksjoner inne i seg. # det har knapper og 'sliders', slik at grafen kan reguleres mens # man viser den, gjennom et eget vindu. og den bruker helt # ferdiglagde oppsett, ferdiglagde navn, som gir mening i visse # statistikk-kontekster. eksemplet er nyttig her mest som en # kontrast til det vi vanligvis viser. det viser ogsaa hvilke # muligheter som er i den pakken som heter TclTk, og som knytter # til flere andre programmeringsspraak slik som perl. I stoerre # grad enn vanlig anbefaler vi at eksemplet brukes mest for aa # faa en foelelse med hva R kan gjoere og slett ikke som noe # som det er lurt aa bruke for mye tid paa aa se paa i detail. # derfor, la oss hoppe inn i eksempelet, kikke fort paa det, # og gaa videre til eksempler som forutsetter mindre og der vi # i mer opplagt grad kan kontrollere detailene i stoerre grad selv. # Her er det mye aa paste. du kan kanskje velge aa paste foerste # linje for seg -- require (tcltk) -- simpelthen for aa sjekke at # denne pakken er paa plass in den versjonen av R du kjoere. videre # kan det vaere greit aa vite at denne pakken er blitt revidert # gjennom aarene slik at det loenner seg at din versjon av R er # noenlunde oppdatert. skulle eksemplet ikke vise seg mulig aa # starte, burde du kunne finne et tilsvarende eksempel som faktisk # virker hvis du kikker i dokumentasjonen knyttet til TclTk-delen # av R. men dette vil virke i fleste standard-installasjoner. # foer du paster dette, la oss si at uttrykket interactive_test # er et samleuttrykk, en samlefunksjon, som har mye inne i seg: # den har en { som avsluttes foerst lenge etterpaa, med et }, og # paa linjen deretter staar det interactive_test() som er at # eksemplet startes opp. husk at du forlater og deretter starter # opp R paa nytt foran hvert nytt eksempel, for aa vaere paa # sikre siden, -- du bruker q() eller quit() for aa avslutte R # hver gang. # merk ogsaa at uttrykket 'kernel=k' finnes i programmet, og at # ordet "gaussian" er et ord som brukes inne i den ferdiglagde # pakken (sammen med andre ord her) for presentering av data # i traad med denne klassiske funksjonen. vi kan derfor tenke oss # at vi kan trekke ut av dette eksemplet en mulighet for aa lage # en helt fiks ferdig gaussisk graf ut fra et sett tall vi # gir den. etterhvert som vi "bruker opp" eksemplene fra standard- # dokumentasjonen til R er dette en naturlig vei videre i vaar # tilnaerming til aa bruke R. alright, her er det hele -- husk # at du kan gjerne ta den foerste linjen for seg, for aa sjekke # at pakken tcltk er en del av den r du bruker. require(tcltk) require(graphics) require(stats) interactive_test <- function(...) { y <- NULL xlim <- NULL size <- tclVar(50) dist <- tclVar(1) kernel<- tclVar("gaussian") bw<- tclVar(1) bw.sav <- 1 replot <- function(...) { if (is.null(y)) return() bw.sav <<- b <- as.numeric(tclObj(bw)) k <- as.character(tclObj(kernel)) sz <- as.numeric(tclObj(size)) eval(substitute(plot(density(y, bw=b, kernel=k),xlim=xlim))) points(y,rep(0,sz)) } replot.maybe <- function(...) { if (as.numeric(tclObj(bw)) != bw.sav) replot() } regen <- function(...) { if (tclvalue(dist)=="1") y<<-rnorm(as.numeric(tclObj(size))) else y<<-rexp(as.numeric(tclObj(size))) xlim <<- range(y) + c(-2,2) replot() } grDevices::devAskNewPage(FALSE) tclServiceMode(FALSE) base <- tktoplevel() tkwm.title(base, "Density") spec.frm <- tkframe(base,borderwidth=2) left.frm <- tkframe(spec.frm) right.frm <- tkframe(spec.frm) frame1 <- tkframe(left.frm, relief="groove", borderwidth=2) tkpack(tklabel(frame1, text="Distribution")) tkpack(tkradiobutton(frame1, command=regen, text="Normal", value=1, variable=dist), anchor="w") tkpack(tkradiobutton(frame1, command=regen, text="Exponential", value=2, variable=dist), anchor="w") frame2 <- tkframe(left.frm, relief="groove", borderwidth=2) tkpack(tklabel(frame2, text="Kernel")) for ( i in c("gaussian", "epanechnikov", "rectangular", "triangular", "cosine") ) { tmp <- tkradiobutton(frame2, command=replot, text=i, value=i, variable=kernel) tkpack(tmp, anchor="w") } frame3 <-tkframe(right.frm, relief="groove", borderwidth=2) tkpack(tklabel(frame3, text="Sample size")) for ( i in c(50,100,200,300) ) { tmp <- tkradiobutton(frame3, command=regen, text=i,value=i,variable=size) tkpack(tmp, anchor="w") } frame4 <-tkframe(right.frm, relief="groove", borderwidth=2) tkpack(tklabel (frame4, text="Slimness")) tkpack(tkscale(frame4, command=replot.maybe, from=0.05, to=2.00, showvalue=FALSE, variable=bw, resolution=0.05, orient="horiz")) tkpack(frame1, frame2, fill="x") tkpack(frame3, frame4, fill="x") tkpack(left.frm, right.frm,side="left", anchor="n") q.but <- tkbutton(base,text="Exit tk panel", command=function() tkdestroy(base)) tkpack(spec.frm, q.but) tclServiceMode(TRUE) regen() } interactive_test()