# http://www.norskesites.org/r-programmering/r-info08.txt in our # tutorial notes series for the programming language r in # norwegian, with the completing notes having mostly freshly # constructed examples for just this series {all written by FiT} # vi fortsetter fra r-info07.txt med denne r-info08.txt der vi slapp, # og fortsetter videre med noen flere til vi har temmet heltalls- # trigonmetri, funksjoner, lister og matriser i R. dette gir oss # presisjon i bruk av R til forskjellige ogsaa statistiske formaal. # det neste maalet er at vi lager en sinus eller cosinus funksjon # som tar heltall inn, og gir heltall ut, via en liste eller noe # slikt som er riktignok laget ved hjelp av innebygde # funksjoner som 'sin' eller 'cos', men som ikke bruker disse # funksjonene -- kun datalisten. dette er en metode som brukes # i endel hoeyhastighets-sammenhenger i forbindelse med grafikk # der man ikke vil vente paa en utregning med litt vel mange # unoedvendige desimaler. isteden brukes en skaleringsfaktor. # la oss skrive funksjonen fra forrige oevelse paa nytt, men # litt annerledes, og med stort sett samme plot av mange sirkler # som antyder en vakker boelge, men generert litt annerledes. # til aa begynne med, forkorter vi funksjonen til 1-2 linjer, # vi bruker 4 sykler, 4 ganger to pi, og vi bruker cosinus. # i tillegg lagrer vi output fra funksjonen i en liste istedenfor # aa gi den direkte til plot. start opp din R, copy og paste # inn det foelgende (alltid med en ekstra blank linje inkludert, # slik at du ikke manuelt behoever aa taste linjeskift) -- # eller lagre det som filnavn.R og bruke source("filnavn.R") # kommandoen slik vi viste i en tidligere oevelse i vaar # serie i norskesites.org/r-programmering. fullsirkel_faktor100 <- 628 firesirkler <- 4*fullsirkel_faktor100 firesam <- 1:firesirkler heltallcosinus <- function(inputx=314159, faktor=100000) { return( round(faktor * cos(inputx / faktor)) ) } vaar_liste = heltallcosinus(firesam, 100) show(vaar_liste) plot(vaar_liste) # her skriver vi, for variasjon og for at man ikke skal bli # for opphengt i noe spesielt ord, 'faktor' istedenfor 'skala'. # vi skriver ogsaa '100' inne i heltallcosinus(firesam, 100) # istedenfor det vi kunne ha skrevet, og som ligner det vi brukte # i forrige oevelse, nemlig heltallcosinus(firesam, faktor=100). # det er altsaa valgfritt om vi vil navngi eller ikke de enkelte # inngangsvariable til en funksjon i R dersom inngangsdataene # kommer i riktig rekkefoelge. men hvis vi har flere inngangs- # variabler enn 2, og vi oensker aa naa frem til den tredje # eller fjerde, maa man gjoere noe slikt som aa navngi de # enkelte inngangsvariable igjen, slik at det blir utvetydig; # og datamaskiner er ingenting dersom vi tar vekk utvetydighet! ;) # som en videre variasjon over, multipliserer vi resultatet med # faktor og avrunder med 'round', slik at ikke bare # input til funksjonen men ogsaa hva den gir av resultater # er fri for desimal-tall. vi kaller den derfor 'heltallscosinus'. # vi lager en liste som heter vaar_liste og viser den paa skjermen, # det blir mange tall, kikk paa dem. de er alle mellom plus minus # den faktoren vi lagde. det er fint aa se at dette gir myke fine # boelger, helt uten at vi har andre tall enn opp til hundre, # uten desimaler. vi har dermed bevist for oss selv, gjennom # eksperimentativ dataprogrammering, at hvis vi tar som input # tallene i firesam, og gir som output tallene i vaar_liste, # -- alt sammen heltall, og med ytterligere kalkulering enn # at vi bare finner hvilket tall som skal matche med hvilket # tall, vil vi kunne klare aa lage cosinus-boelger helt uten # bruk hverken av cos eller sin eller noe slikt, og ogsaa # helt uten bruk av desimaltall. klarer vi det med 100 som # faktor kan vi ogsaa ha 100000 som faktor, men ved at vi # jobber frem resultatene med 100 som faktor, kan vi kikke # paa hver ting vi gjoer, og hver ting vi gjoer gaar fort; # mens dersom vi skal lage lister paa hundretusner av # elementer og regne paa dem og plotte dem kan det lett # skje at maskinen trenger en aldri saa liten restart, med # mindre vi lar den jobbe lenge. derfor er det en foerste-haands # tilnaerming til programmering at vi tilpasser prosessen # mest mulig til hva som gir psykologisk god mening, baade # naar det gjelder mengde tall og tidsforbruk -- men at vi # mental forbereder oss paa aa bruke skalaer som 1000, 10000 # eller mer, senere, hvis det trengs. vi arbeider ut fra # aa lage en ganske generell algoritme, men arbeider med # spesifikke meningsfulle tall. # kan vi bruke en faktor som f.eks. 50 eller 500 eller 5000? # svaret er ja, vi kan skalere det slik vi vil, men det er # mer meningsfylle data dersom tallene ligner paa de # desimaltall som vi er nok er mer kjent med. 31416 ligner # f.eks. paa 3.1416 og her en faktor paa 10,000 brukt. # dersom skalen er 5,000 vil tallrekken endres, ikke bare # med tanke paa desimalpunktumet, men med tanke paa hvilke # siffre i som er i tallrekken -- fordi vi bruker det # saakalte titallssystem. # i programmeringsspraaket R brukes <- veldig ofte naar # nye variabler opprettes, men naar du lager en ny # funksjon, er det vanlig at = naar du du setter # variabler inn i parentesen for aa gi variablene # standardverdier. men utenfor akkurat den parantes # gjelder det generelt at <- er aa anse, i r, som # 'sterkere' enn =, for den affirmerer at denne # sammenhengen skal ha dette som variabel mens = # foerer til en sjekk paa om variabelen er definert # tidligere i r, f.eks. i en statistikk-pakke som # er hentet inn, f.eks. naar man skriver require(grid). # som tommelfingerregel, bruk <- bortsett fra naar det # gjelder inne i parentesen til funksjoner. proev aa # bruke varibel-navn som tydelig tilhoerer ditt eget # program heller en varibel-navn som kanskje allerede # er definert et eller annet sted inne i R. som eksempel, # skriv heller 'faktorx' enn bare 'x'. # du legger kanskje merke til at det er behagelig og # uanstrengt aa lage nye variabler i r, akkurat som stack- # orienterte programmeringsspraak av typen pmn er # uformelle og enkle naar det gjelder aa legge inn nye # tall uten noen overordnete definisjoner. derimot, # i slikt som java, maa man hele tiden si akkurat hva # slags variabler, og, hvis tall, hva slags tall, man # skal bruke foer man skal bruke dem. (det finnes # sammenhenger der definisjoner av denne typen er # viktig -- naar man trenger store datamengder # prosessert; R er enkel men R er langsom hvis man # presser paa med store matriser; pmn loeser dette # paa andre maater enn baade R og java; pmn har ogsaa # en parallelitet som disse ikke har for pattern # matching og slikt). # start opp R paa nytt og en litt annen versjon av det # hele, denne gang med sinus igjen, og med fokus paa # kun en sirkel for aa lage en ny funksjon, gis her. # legg merke til at vi plotter ikke resultatet av # funksjonen som inneholder sinus. det vi plotter her # er en ny funksjon, en som kikker inn i en liste av # tall. merk ogsaa at vi er friere her med linjeskift, # noe som er viktig i dataspraak som tillater lange # forklarende variabelnavn. {i pmn legger man lengre # informasjon konsekvent ut i form av kommentarer, # og dermed trengs ikke slik variasjon i input.} # alright! ta hele denne haugen og se om vi klarer # aa faa frem en vakker sinussyklus UTEN bruk av sinus # i den endelige funksjon 'our_unsinning_sin'. # {leking med begreper er viktig for at hjernen skal # lagre ny informasjon raskere, har forskning vist; # derfor de mange variasjoner i vaare navn her; # dette kan man ogsaa gjoere i form av program- # kommentarer etc. det er ogsaa vist at bruken av # metaforer spesielt seksuelle og dramatiske # metaforer virker befordrende for laering!} # merk at vi her bruke hakkeparenteser [ .. ] for # aa hente ut tall fra lister og matriser. ensyklus_faktor100 <- 1:628 heltallsinus_lage_dataene <- function( inputx=314159, faktor=100000) { return( round(faktor * sin(inputx / faktor)) ) } sinusliste_faktor100 <- heltallsinus_lage_dataene( ensyklus_faktor100, 100) our_unsinning_sin <- function( inputtall ) { return( sinusliste_faktor100[ inputtall ] ) } plot( our_unsinning_sin( 1:628 ) ) # jubilations, det virker! dette betyr ogsaa at # vi kan lagre listen med 628 tall paa # disken, om vi vil, og hente den frem, og bruke den nye # funksjonen our_unsinning_sin( .. ) for aa # generere sinus verdier. merk at vi begynner paa 1 # og fullfoerer ved 628 istedenfor aa begynne ved 0 # og fullfoerer ved 627, dette er fordi R starter # sine liste-indekseringer normalt paa 1, heller enn # 0. hvis vi skriver 0:627 blir det forvirrende, # for 0 kommer i posisjon 1, og saa videre. # om vi vil, kan vi regenerere opprinnelig sinus # med den noeaktighet vi vil innenfor grensen til # den opprinnelige funksjonen ved at vi tar en stoerre # faktor, og deler resultatet paa faktoren igjen -- hvis vi # vil ha desimaltall tilbake. # vi kan laere mer om R gjennom aa forfine dette # litt. gjennom at vi fortsetter arbeidet med aa # skape slike funksjoner og lister vil evnen til aa # raskt benytte resten av R-dokumentasjonen # aksellerere. en utfordring er aa estimere kvadratrot # over et stort spekrum av tall gitt en array som # dekker et forholdsvist lite spektrum. # for til forskjell fra sinus har sqrt inngangstall # som kan variere fra 2 og opp til hundrevis av # millioner og med mer eller mindre unike svar for # hver enkelt tallverdi. # vi klarer aa lage en begrenset liste som likevel # kan brukes til aa gjenskape en praktisk kvadratrot # med hoey men ikke total presisjon, superb hastighet, # og foerste-haands enkelhet. # for de som er interessert, litt om 3d-tenkning: # skal man rotere noe i tre dimensjoner paa en # dataskjerm, trengs sinus, cosinus, kvadratrot, # multiplikasjon av et tall med seg selv, addisjon, # og divisjon, og ogsaa noe slikt som det som # tradisjonelt (men vi skal snakke om alternativer # i neste oevelse) kalles atan2(n1, n2) for aa gaa # omvendt vei, tilbake til radian-vinklene som gjerne # er inngangstallene til sinus og cosinus. # og det er ALT vi trenger. ingenting mer. # resten er bare optimalisering av hastighet. # i essens trengs derfor ikke linaere transformasjoner # av matriser, hvis man simpelthen tenker optimalisering # ut fra disse enkle funksjoner. dette er for meg # ikke en teori, for jeg har programmert dette mer # enn en gang: # divisjon brukes for aa skalere et objekt ned # jo lenger vekk det skal presenteres. hvert # objekt beskrives ved tre koordinater og man # takler to av dem ad gangen. man finner ut hvilken # vinkel de har med atan2, finner avstand ved # bruk av pytagoras (kvadratroten av den ene # siden av en trekant i annen pluss den andre # siden av trekanten i annen), og deretter # endrer man disse faktorer og kalkulerer # tilbake til nye koordinater. # hvis man beholder de opprinnelige koordinater # for hvert objekt, og regner hele tiden ut fra # disse, vil feilmarginene ikke oeke for hver # enkelt transformasjon i det tredimensjonale # rom. og siden det alltid er litt fluktuasjon # i form pga at det bare er noen desimaler (eller # hva det er), er det viktig at denne fluktuasjonen # ikke oeker mer og mer jo mer man lar simuleringen # av 3d fortsette paa dataskjermen. # jeg nevner alt dette ikke minst fordi det er # viktig aa vite at 3d ikke boer hypnotisere noen: # det er ikke mer komplisert enn aa lage en # middag med flere retter; der hver enkelt rett # er en totalt enkel regneoperasjon. men slik 3d # paa dataskjermen innebaerer bruk av en vanvittig # stor mengde datatall, og skal man i tillegg ha # flytende bevegelser som en illusjon, maa # hastigheten oekes til minst 25 ganger pr sekund # for presentering av hvert enkelt bilde. dette # betyr at kvaliteten av dataprogrammet senkes, # pga enorme datamengder. programmet vil fylles # mer av mer av kompliserte optimaliseringsmetoder # som gjoer ingenting annet enn aa replisere sinus, # cosinus, atan2, sqrt (square root), over og over, # bare litt fortere. og resultatet? at istedenfor # aa fokusere paa aa presentere en vakker graf eller # et vakkert foto eller noe slikt, brukes den # datamaskinelle energi opp paa aa skape en # skinn-bevegelse, gjennom et over-komplisert # dataprogram som egentlig gjoer bare trivielle # ting. derfor ikke tro paa 3d. tro paa ditt eget # sinn. la datamaskinen brukes til meningsfylt # arbeid for aa presentere stimuli til ditt eget # og til andres sinn, ikke bruk elektronikk som # en dop til erstatning for det levende manifeste # univers -- som er en subtil bevegelse i langt # mer enn 3 dimensjoner (antagelig mere 16). # dette har flere nivaaer, derfor kan vi # konsekvent si 'multiverset' naar vi vil vise # til hele eksistensen av det organiske, subtile # nettverk av bevegelser og sinn. dette er en # filosofi med mange interessante praktiske # implikasjoner for synet paa skjoennhet (se # andre notater i yogat6d.org/economy.htm som # peker videre til utdypninger vi har gjort om dette, # hvis du vil). # altsaa, videre med forfining av denne funksjon # og med takling av slikt som sqrt i de neste par # r-info. da begynner hele intro-serien aa bli # komplett.