Tips for en enklere start med R og RStudio

Noen kjappe tips for å gi deg en bra arbeidsflyt i R og RStudio
Author

Håvard Karlsen

Published

February 22, 2024

Her er noen kjappe tips som vil gjøre det enklere å arbeide med R.

Tips 1: Bruk RStudio

Jobber du i brukergrensesnittet som kom med R-installsjonen din? Dropp det og last ned RStudio. Det vil gjøre jobben din enklere.

RStudio og Rs IDE

RStudio gir deg:

  • Tab-fullføring av kode: begynn å skriv kode, få opp forslag og trykk tab for å fylle ut resten automatisk.
  • Støtte for Quarto eller Rmarkdown for å skrive bedre dokumentasjon av koden din
  • Støtte for prosjekter for å enklere holde orden på kodeprosjektene dine
  • Dark theme på appen. Arbeidet ditt ser umiddelbart 90 % mer profesjonelt ut.

Tips 2: Skru av automatisk gjenoppretting av workspace

Har koden som kjørte knirkefritt plutselig slått seg vrang og produserer helt andre resultater? Får du rare feilmeldinger der hvor alt før var fryd og gammen? Mesteparten av disse feilene skyldes at du har standardinnstillingene på i RStudio.

Korrekte innstillinger

Pass på at du har fjerna avhukinga på Restore .RData into workspace at startup og at du har never i nedfallsboksen under dette.

I korte trekk: Standardinstillingene er at RStudio lagrer workspacet ditt hver gang du lukker programmet og gjenoppretter det slik det så ut neste gang du starter RStudio. Det inkluderer alle innlasta pakker og definerte objekter og funksjoner. Det vil si at du får med deg bagasjen fra alt du tidligere har gjort. En bedre tilnærming er å periodisk restarte R for å renske opp i rotet.

Standardinnstillingene er som om du aldri rydder skrivebordet ditt. Alt som legges der forblir låst til bordet. Etter hvert vil det bli vanskelig å arbeide fordi bordet er overfylt og du ofte tar feil ark eller blyant. Det er bedre å holde det reint og ryddig.

Tips 3: Bruk prosjekter i RStudio

Prosjekter er flotte verktøy for å organisere koden din. For det første hjelper de deg å holde orden på koder og datasett som hører til ulike prosjekt.

I ferd med å starte et nytt prosjekt

For det andre gjør de koden din mer portabel og robust fordi alle filstier nå er relative til prosjektmappa di. Istedenfor å henvise til en fil som ligger på f.eks. ~/hk/mine_dokumenter/dropbox/R/pingvin_artikkel/data/penguins.csv kan jeg lage et prosjekt i mappa ~/hk/mine_dokumenter/dropbox/R/pingvin_artikkel. Hvis jeg vil laste inn fila penguins.csv i undermappa R, trenger jeg nå bare henvise til R/penguins.csv.

Dette gjør det mulig å dele koden din med andre uten at de må gå inn og endre alle filstier du oppgir. Om du trenger enda mer fleksibilitet, kan du også bruke pakka here.

Bonusrunde for Windows-brukere

Windows har en rekke programfilosofier som ikke spiller helt på lag med en rekke programmeringsverktøy. Noen av disse pleier føre til rot og stygge ting som vi (eller, dere som har Windows) må forholde oss til. Her er noen tips for å unngå/omgå det.

WIPS 1: Bruk rett tegnkode

Jobber du med norske data i Windows? Kondolerer! Ser du rare tegn der du forventer å se våre kjære nordiske Æ, Ø og Å? Det er ikke hevn fra Amerikanernes side fordi vi har større alfabet. Det er fordi Windows har sin egne måte å håndtere ulike tegnkoder.

Dette er et enormt tema som jeg ikke skal forsøke å forklare. Istedenfor skal jeg bare si hva som funka for meg da jeg var låst til Windows-økosystemet.

Jeg kjørte dette kodestykket hver gang jeg starta en ny R-sesjon: Sys.setlocale("LC_ALL", "nb-NO.UTF-8"). Den gjør at R alltid bruker unicode sitt tegnsett og korrekt viser våre norske bokstaver.

Jeg kan ikke garantere at dette vil funke for deg. I min erfaring har dette alltid hjulpet dersom problemer er at f.eks. Æ vises som et annet symbol eller en samling tilfeldige tegn.

Det er irriterende å skulle kjøre den koden hver eneste gang du restarter R (som du burde gjøre ofte!). Derfor anbefaler jeg deg å legge den inn i Rprofilen din.

WIPS 2: Bruk Rprofilen din

Rprofilen din er en fil som ligger i “rot”-mappa di. Alt av kode som står i den vil kjøres på starten av en hver R-sesjon. Hvis du har en kode du alltid kjører er det smart å putte den inn her. Slik som Sys.setlocale() som vi brukte over.

Fila heter .Rprofile og du finner den vanligvis i Mine Dokumenter. Hvis du er usikker på hvor den er, kan du bruke funksjonen edit_r_profile() fra pakka usethis. Husk at du må installere pakka først med install.packages("usethis").

Funksjonen åpner Rprofil-fila og du kan skrive inn kodene du vil her. Merk at du må restarte R før endringa har effekt.

WIPS 3: Len deg rett vei

UNIX-baserte operativsystemer (som Ubuntu, macOS) bruker / for å markere mapper i et filhierarki. Har du f.eks. en mappe R i rotmappa di, og en mappe cowboy inni denne, som igjen har fila bebop.R i seg, vil det representeres slik: R/cowboy/bebop.R. Windows’ operativsystemer bruker derimot \ istedenfor. Slik at filstien blir hetende R\cowboy\bebop.R på en Windows-maskin.

R bruker Unix-stilen for å henvise til filer. Det fører til problemer når du skal f.eks. kopiere inn en filsti fra filutforskeren. Om du kopierer bebop.R-filas filsti over vil du få den limt inn i R som R\cowboy\bebop.R og du må manuelt endre alle skråstrekene til å lene seg framoer til å bli R/cowboy/bebop.R.

Eventuelt kan du la skråstrekene “unnslippe” (escape) ved å bruke en escape character-en \. Når R tolker tegn er det en del som er reservert for spesielle operasjoner. Bruker du \ indikerer du at R skal behandle dette tegnet som et vanlig tegn og ignorere den spesielle operasjonen. For å escape \ skriver du altså \\. Stien over blir da R\\cowboy\\bebop.R. Ikke egentlig noe særlig bedre, for du må fortsatt manuelt endre stien. Tidkrevende om du har en mappestruktur med dypt hierarki.

Forvirrende skråstreker

Etter å ha irritert meg over dette lenge i min forhenværende Windows-karriere lærte jeg meg følgende funksjonkombinasjon: paste0(readClipboard()). Den henter ut innholdet av utklippstavla og printer det til konsollen i ferdig Rstudio-vennlig format. Herfra kan du kopiere den og lime inn i koden din uten å måtte gjøre manuell formatering.

Siden jeg brukte denne en del lagde jeg en egen funksjon som simpelthen var en wrapper for den, og la den i Rprofilen min. Om du vil gjøre det samme kan du legge følgende i Rprofilen:

stilim <- function() paste0(readClipboard())

Da kan du seinere bare påkalle stilim() for å printe ut en ferdig formatert filsti etter at du har kopiert den fra f.eks. filutforskeren.

Merk at readClipboard() er en funksjon som kun finnes i R installert på en Windows-maskin.

Du kan også sjekke ut raw character vectors, som ser ut til å gjøre samme jobben. Her er en bloggpost som diskuterer det.

Avanserte tips

På slutten er noen “avanserte” tips. Det vil si tips du kan bruke når du har mestra tipsa over.

Aips 1: Lag mange små skript

Skriv koden din i skript. Da har du en oppskrift på hva du har gjort. Lange skript blir fort uoversiktelig. Jeg foretrekker derfor å lage mange små skript som gjør hver sine ting. Deretter påkaller jeg alle skriptene fra et hovedskript som jeg ofte kaller main.R. Dette main-skriptet kan se slik ut:

source("load_data.R")
source("clean_data.R")
source("run_analysis.R")

Hver av disse tre skriptene har sin funksjon, og deres mening er tydelig fra navngivinga mi. Hvis noe går galt i reingjøringa av dataene kan jeg gå inn i det skriptet og fikse det uten å risikere å ødelegge noen av dataimport- eller analysefunksjonene.

Aips 2: Lær deg å like funksjoner

Å lage egne funksjoner kan høres skummelt ut, men det er morsomt når man er i gang. Og du kan få til de utroligste ting. Er det noen kodeblokker du oppdager at du bruker til stadighet og kopierer inn fra et annet dokument? Gjør det om til en funksjon! Bruker du samme funksjon fra en pakke, men med ulike argumenter? Lag din egen wrapper!

En enkel funksjon ser slik ut:

small_function <- function(a) print(a)

Du starter med å gi funksjonen et navn, her small_function. Så definerer du at det er en funksjon med å påkalle funksjonen function(). Du kan velge om du vil gi funksjonen noen parametere (her ga vi den én, kalt a). Resten av linja er hva funksjonen gjør. I dette tilfellet vil den bare printe ut hva enn a er.

small_function("Déjà vu")
[1] "Déjà vu"

De fleste funksjoner går over flere linjer. Da bruker du {} til å omslutte innholdet til funksjonen:

large_function <- function(a, b, c) {
  d <- a + b
  e <- c^2
  f <- d - e
  f
}

I denne funksjonen gjøres mange operasjoner som ender i tallet f, som returneres til skjermen.

large_function(1, 2, 3)
[1] -6

Kos deg med å lage dine egne funskjoner!