Litteratur Statistisk Programmering Programmering i R Göran Broström gb@stat.umu.se Statistiska institutionen Umeå universitet 901 87 Umeå Läs An Introduction to R. Dalgaard (2002): Introductory Statistics with R, Springer. Venables & Ripley (2002): Modern Applied Statistics with S, Fourth Edition. Springer. Venables & Ripley (2000): S Programming. Springer. (i stigande svårighetsgrad ). Statistisk Programmering, hösten 2002 p.1/24 Statistisk Programmering, hösten 2002 p.2/24 Logiska AND och OR I villkorssatser: &&: AND : OR if ( (x >= 1) && (x <= 2) )... Vektoriserande: &: AND : OR x.sub <- x[(x >= 1) & (x <= 2)] Funktioner i R En funktion f saknar sidoeffekter om > y <- f(x) endast ändrar/skapar y. Önskvärd egenskap, oftast. Tips: Använd parenteser och mellanslag flitigt!! Statistisk Programmering, hösten 2002 p.3/24 Statistisk Programmering, hösten 2002 p.4/24
Funktioner i R Enda sättet att returnera ett värde från en funktion är via sista raden. I R vet vektorer hur långa de är! Lexical scoping I R vet funktioner var de är definierade, och de har tillgång till objekt definierade där! Var letas en variabel? Jo, 1. Lokal variabel. 2. I argumentlistan. 3. Den definierande miljön. Obs: gäller variabler till höger om <-. Variabler i den definierande (eller anropande) miljön kan inte förändras (inga sidoeffekter)! Statistisk Programmering, hösten 2002 p.5/24 Statistisk Programmering, hösten 2002 p.6/24 Lazy evaluation Funktionsargument C, Fortran: En variabel i argumentlistan utvärderas vid anropet. R: En variabel i argumentlistan utvärderas när den behövs! aktuellt argument utvärderas i anropande miljön (parent frame). frånvarande (default) argument utvärderas i funktionsmiljön (local frame). En lazy attityd även här: Endast pekare (adresser) till argumenten skickas till funktionen. Om ett argument modifieras i funktionen tas en kopia som modifieras. Värdet i anropande program ändras ej! Inga sidoeffekter. Statistisk Programmering, hösten 2002 p.7/24 Statistisk Programmering, hösten 2002 p.8/24
Flödeskontroll, while Flödeskontroll, repeat Newtons metod för rotutdragning : square.root <- function(y){ if (y < 0) stop("negative values no-no") x <- y / 2 while ( abs(x * x - y) > 1e-10 ) x <- (x + y/x) / 2 x Det kan hända att en while-loop inte genomlöps någon gång. square.root <- function(y){ if (y < 0) stop("negative values no-no") x <- y / 2 repeat{ x <- (x + y / x) / 2 if ( abs(x * x - y) < 1e-10 ) break y x repeat-loopen genomlöps minst en gång. Statistisk Programmering, hösten 2002 p.9/24 Statistisk Programmering, hösten 2002 p.10/24 Flödeskontroll, for Sammansatta uttryck > x <- seq(0, 1,.05) > plot(x, x, ylab = "y", type = "l", + main = "Power curves") > for (j in 2:8) lines(x, xˆj) repeat{ x <- (x+y/x)/2 if (abs(x*x-y) < 1e-10) break Power curves Kallas ett sammansatt uttryck. Värdet är värdet av sista uttrycket. y 0.0 0.4 0.8 Rekommendation: Använd alltid { i samband med for, while och repeat! 0.0 0.2 0.4 0.6 0.8 1.0 x Statistisk Programmering, hösten 2002 p.11/24 Statistisk Programmering, hösten 2002 p.12/24
Villkorliga uttryck, if Villkorliga uttryck, ifelse appr.eq <- function(x, y){ identical(all.equal(x, y), TRUE) if (appr.eq(x, y)){ do.something else if (x < y){ do.something.else else{ stop("y can t be smaller than x") > x <- ifelse(x < 0, 0, x) ersätter alla negativa värden i vektorn x med 0 (noll). Vektoriserad version av if. for (i in 1:length(x)){ if (x[i] < 0){ x[i] <- 0 x <- pmax(x, 0) ger också önskat resultat. Statistisk Programmering, hösten 2002 p.13/24 Statistisk Programmering, hösten 2002 p.14/24 Kategoriska variabler, factor apply, lapply och sapply En faktor har nivåer (level). Exempel: > pain <- c(0, 3, 2, 2, 1) > f.pain <- factor(pain, levels = 0:3) > levels(f.pain) <- + c("none", "mild", "medium", "severe") En användbar funktion är relevel, som väljer (ny) referenskategori. > f.pain <- relevel(f.pain, ref = "medium") Exempel: X matris: > apply(x, 2, mean) vektor av kolumnmedelvärden. X lista: lapply(x, quantile, probs = (1:3)/4) lista av kvartiler. sapply: Användarvänlig version av lapply. Statistisk Programmering, hösten 2002 p.15/24 Statistisk Programmering, hösten 2002 p.16/24
tapply > library(mass) > data(painters) > attach(painters) > tapply(composition, School, sum) A B C D E F G H 104 73 79 91 95 29 97 56 Läs hjälpsidorna och experimentera med apply-familjen! Egna R-bibliotek 1. Skapa en katalog my.package. 2. Skapa underkatalogerna R och man. 3. Lägg R-funktioner i R och dokumentation i man. 4. skapa filen DESCRIPTION i my.package 5. I my.package, > cd.. > Rcmd check my.package > Rcmd build my.package > Rcmd install my.package XX.tar.gz Statistisk Programmering, hösten 2002 p.17/24 Statistisk Programmering, hösten 2002 p.18/24 Package: Filen DESCRIPTION my.package Version: 0.1 License: GPL version 2 or newer Description: For doing my favourite tricks Title: My package Author: Göran Broström Maintainer: Göran Broström <gb@stat.umu.se> är obligatoriska rader. I R: > prompt(funk) skapar en prototyp funk.rd Editera den och spara i my.package\man Dokumentation Upprepa för varje funktion i my.package. Se Writing R Extensions för detaljer! Statistisk Programmering, hösten 2002 p.19/24 Statistisk Programmering, hösten 2002 p.20/24
Bygga och installera my.package R-bibliotek med kompilerad kod I my.package: C:\home\R\my.package> cd.. C:\home\R> Rcmd check my.package C:\home\R> Rcmd build my.package C:\home\R> Rcmd INSTALL my.package 0.1.tar.gz Nu är my.package klart att använda! 1. I my.package, skapa katalogen src 2. Lägg C/Fortran-kod i src 3. Anropa C-kod med.c( ) i R. 4. Anropa Fortran-kod med.fortran( ) i R. 5. I katalogen R: filen zzz.r:.first.lib <- function(lib, pkg){ library.dynam( my.package, pkg, lib) Statistisk Programmering, hösten 2002 p.21/24 Statistisk Programmering, hösten 2002 p.22/24 Exempel med kompilerad kod Uppgifter till lektion 3 R-FUNKTION falt <- function(x, y){.c("falta ", as.integer(length(x)), as.double(x), as.integer(length(y)), as.double(y), z = double(length(x) + length(y) - 1), PACKAGE = my.package )$z C-FUNKTION void falta(int *nx, double *x, int *ny, double *y, double *z){... 1. Läs readme.packages, som finns i C:\Program\R\rw1061. Från Ripleys portal, installera tools.zip, packa upp i C:\bin Perl från activestate. MinGW-2.0.0-3.exe, följ Ripleys anvisningar. Microsoft HTML Help Workshop. Sökvägar måste sättas! 2. Testa installationen genom att installera ett litet bibliotek med C- eller Fortran-kod. Statistisk Programmering, hösten 2002 p.23/24 Statistisk Programmering, hösten 2002 p.24/24