Pakker (R Package)

3.1 Hvad er en pakke i R?

En pakke indeholder funktioner, der gør dit arbejde lettere og mere effektivt. Pakkerne er således tilføjelser til R, og de udvider funktionaliteten i R. Selv om standardinstallationen af R har mange kraftfulde værktøjer, er de ikke nok til at arbejde effektivt og bekvemt. Du skal installere pakker, og de gør arbejdet både sjovere og lettere. I dag findes der cirka 18810 pakker. Du kan installere en hvilken som helst pakke på få sekunder. Pakkerne gennemgår validering af eksperter. Alle pakker har åben kildekode, som du kan gennemgå, når du vil (det gør begyndere sjældent).

3.1.1 Eksempler på populære pakker til R

  • ggplot2 til visualisering af data.
  • dplyr til bearbejdning af data.
  • tidyr til bearbejdning af data.
  • survival til overlevelsesanalyse.
  • tidymodels til at oprette, sammenligne og evaluere prædiktionsmodeller.
  • forcats til at håndtere kategoriske variabler.
  • stringr til at håndtere tekststrenge.
  • purrr til at effektivisere brugen af funktioner.

3.1.2 Sådan installerer man pakker i R

Installer og aktivér pakker

En pakke installeres kun én gang. Efter installationen er pakken tilgængelig for R. For at bruge pakken skal du aktivere den, hver gang du starter R.

Før du bruger en pakke, skal du installere og aktivere pakken. En pakke installeres kun én gang, men den skal aktiveres, hver gang du starter R. Standardinstallationen af R leveres med flere forudinstallerede pakker. Disse pakker indeholder de mest grundlæggende funktioner, som for eksempel grundlæggende matematiske operationer.

For at installere en pakke bruger du funktionen [install.packages()](https://rdrr.io/r/utils/install.packages.html). Herunder installeres pakken dplyr. Bemærk, at pakkens navn skrives med anførselstegn:

install.packages("dplyr")

3.1.3 Sådan opdaterer man en R-pakke.

Selv om du kun installerer pakken én gang, kan det være nødvendigt at opdatere den. Opdateringer foretages sjældnere, og for de fleste pakker er en eller et par opdateringer om året nok. Opdater pakken med følgende kommando:

update.packages("dplyr")

Du kan også opdatere en pakke ved at installere den igen (R overskriver så den gamle version af pakken).

3.1.4 Code breaking updates

Langt de fleste opdateringer af pakker foretages på en sådan måde, at gammel (eksisterende) kode fortsat fungerer normalt. Det betyder, at din kode med stor sandsynlighed også vil fungere, efter at du har opdateret en pakke. Opdateringer kan derfor foretages uden større bekymring. Nogle gange foretages der dog større ændringer i pakker, hvilket kan føre til, at din kode ikke længere fungerer efter en opdatering. På engelsk kaldes dette code breaking updates. Du bør have mistanke om dette, hvis din kode returnerer fejlmeddelelser (errors) efter en opdatering. Det er næsten altid let at løse disse problemer ved at gennemgå pakkens opdaterede dokumentation. Som regel kræves der meget små justeringer af koden, for at den fungerer igen.

3.1.5 Installer pakker uden kommando

Du kan installere pakker i R uden at skrive en kommando. Det anbefales ikke, fordi man bør have alle hændelser og kommandoer dokumenteret i kronologisk rækkefølge i koden. For fuldstændighedens skyld følger der alligevel en vejledning i, hvordan man installerer pakker uden kode. I eksemplet nedenfor, se Figure 3.1, installerer vi pakken rms:

  1. Klik på fanen Packages i det nederste højre vindue.
  2. Klik på Install øverst til venstre.
  3. Skriv navnet på pakken (rms) i søgefeltet.
  4. Klik på Install.
RStudio med fanen Packages og knappen Install markeret med en ring samt dialogboksen Install Packages, hvor rms er skrevet ind
Figur 3.1. Installer pakker manuelt i R.

For at fortsætte dette kursus skal vi installere flere pakker. Du kan installere flere pakker ved at gentage funktionen [install.packages()](https://rdrr.io/r/utils/install.packages.html) på flere linjer, som følger:

install.packages("dplyr")
install.packages("ggplot2")
install.packages("rms")
install.packages("tidymodels")

Ovenstående kode bryder dog med princippet DRY, som står for Don’t Repeat Yourself. Når du programmerer, skal du minimere antallet af gentagelser. God kode er kortfattet og indeholder ikke gentagelser. Derfor opretter vi nu en vektor med navnene på pakkerne, og i funktionen [install.packages()](https://rdrr.io/r/utils/install.packages.html) angiver vi kun navnet på vektoren.

Bemærk, at nogle linjer i koden nedenfor begynder med #, hvilket betyder, at de er kommentarer. En kommentar er ganske enkelt en note, der forklarer koden, så du og dine medarbejdere kan forstå den. Kommentaren evalueres ikke af R.

## Med funktionen c() oprettes en vektor med de pakker, der ønskes installeret
new_packages <- c("dplyr", "ggplot2", "rms", "tidymodels")

## installerer pakkerne
install.packages(new_packages)

Vi kunne have forkortet dette yderligere ved at springe trinnet over, hvor vektoren oprettes, som følger:

install.packages(c("dplyr", "ggplot2", "rms", "tidymodels"))

Den sidste variant er kortfattet og indeholder ingen gentagelser. Bemærk også, at vi i det sidste eksempel har ladet én funktion ([install.packages()](https://rdrr.io/r/utils/install.packages.html)) omslutte en anden funktion ([c()](https://rdrr.io/r/base/c.html)). Det er det smukke ved R, nemlig muligheden for at indlejre funktioner i andre funktioner. Fremover vil du opdage, at det muliggør kraftfulde operationer.

3.1.6 Indlæs pakker i R

Hver gang du starter R, oprettes en ny session. Det betyder følgende:

  1. Dit Environment er tomt.
  2. Kun enkelte pakker, der indgår i standardinstallationen, er aktiveret.

Derfor indledes hvert script som regel med et par linjer, der aktiverer de pakker, der skal bruges. Det kan for eksempel se ud som i Figur 3.2. Bemærk, at pakker indlæses med funktionen [library()](https://rdrr.io/r/base/library.html).

R-script i RStudio med kommentarer, install.packages for ggcorrplot og library-kald, der indlæser ni pakker
Figur 3.2: Et script i R indledes som regel med et par linjer, hvor de nødvendige pakker indlæses. Her installeres også en pakke, før pakkerne indlæses. Der er kommentarer i koden for at tydeliggøre, hvad der sker.

Bemærk, at anførselstegn ikke er nødvendige, når pakker indlæses!

3.1.7 Error, når pakker aktiveres

R returnerer en fejl, hvis du forsøger at indlæse en pakke, der ikke er installeret. Vi vil nu forsøge at indlæse en pakke, der hedder polish, og som ikke er installeret:

library(polish)
Error in library(polish): there is no package called 'polish'

3.1.7.1 Vellykket aktivering af pakker

R returnerer en meddelelse, når en pakke er blevet indlæst. Denne meddelelse kan indeholde vigtig information. Når pakken dplyr indlæses, vises følgende information:

library(dplyr)
Attaching package: ‘dplyr’

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union

Der er vigtig information i meddelelsen ovenfor. Du vil ofte se lignende meddelelser, og du skal være opmærksom på dem. Meddelelsen siger følgende:

  • Funktionerne [filter()](https://dplyr.tidyverse.org/reference/filter.html) og lag() fra pakken stats bliver maskeret.
  • Funktionerne [intersect()](https://generics.r-lib.org/reference/setops.html), [setdiff()](https://generics.r-lib.org/reference/setops.html), [setequal()](https://generics.r-lib.org/reference/setops.html) og [union()](https://generics.r-lib.org/reference/setops.html) fra pakken base bliver maskeret.

Det betyder, at hvis du herefter bruger funktionen [filter()](https://dplyr.tidyverse.org/reference/filter.html), bruger du den [filter()](https://dplyr.tidyverse.org/reference/filter.html), der findes i pakken dplyr, og det samme gælder for de øvrige funktioner, der er maskeret af dplyr. Du kan dog stadig bruge de maskerede funktioner, men det kræver, at du angiver pakkens navn foran funktionens navn, som følger:

stats::filter()
stats::lag()

base::intersect()
base::setdiff()
base::setequal()
base::union()

Det er metoden til eksplicit at fortælle R, hvilken funktion du vil bruge. Bemærk de to koloner (:) mellem pakkens og funktionens navn.

Ikon af et programvindue med farvede kodelinjer

Maskerede funktioner

Ved aktivering af en pakke kan funktioner i andre pakker blive maskeret. Det skyldes som regel, at funktionerne i de forskellige pakker har samme navn. For at bruge maskerede funktioner skal pakkens navn og to koloner (:) stå foran funktionens navn.

3.1.7.2 Error ved brug af funktioner fra pakker, der ikke er aktiveret

R returnerer en fejl, hvis du forsøger at bruge funktioner i pakker, der ikke er indlæst. I eksemplet nedenfor forsøger vi at bruge funktionen splined(), som findes i en pakke, der i øjeblikket ikke er aktiveret.

## Vi skal lede efter tallet 5 i en række af 9 tal
## Strenge kan findes med funktionen str_detect()
str_detect(string ='1 2 3 4 5 6 7 8 9',
           pattern = '5')
Error in str_detect(string = "1 2 3 4 5 6 7 8 9", pattern = "5") :
  could not find function "str_detect"

Denne fejlmeddelelse betyder ganske enkelt, at R ikke kan finde funktionen i nogen af de pakker, der i øjeblikket er aktiveret. For at løse dette skal du enten aktivere pakken (med funktionen [library()](https://rdrr.io/r/base/library.html)) eller angive pakkens navn (og to koloner) foran funktionens navn, som følger:

stringr::str_detect(string ='1 2 3 4 5 6 7 8 9', pattern = '5')
[1] TRUE

3.1.8 Pacman indlæser og installerer flere pakker på én gang

R har ingen indbygget funktion til at aktivere flere pakker på én gang. Heldigvis findes funktionen p_load() i pakken pacman, som gør det muligt at aktivere flere pakker på én gang og desuden installere pakker, der mangler.

Installer pacman med følgende kommando:

install.packages("pacman")

Derefter kan du aktivere flere pakker på én gang med p_load(). Hvis du mangler nogen af pakkerne, vil pacman installere dem:

p_load(survival, ggplot2, lubridate)

3.1.9 Andre pakker i R

Alle pakker, der er gennemgået og godkendt, findes på CRAN.

3.2.0 Tidyverse: En revolutionerende pakke

R er traditionelt blevet betragtet som et svært sprog. Det er ret let at forstå, når man ser, hvor omstændeligt det kan være at gøre noget så trivielt som at filtrere rækker i en tabel. Antag, at du har en tabel med observationer af mænd og kvinder, og at du nu kun vil beholde mændene til yderligere analyser. I traditionel R-kode skrives dette som følger:

my_data_frame[my_data_frame$Sex == 'Male',]
  • **my_data_frame** er navnet på vores data frame
  • Sex er en kolonne i vores data frame
  • Symbolet **$** bruges til at referere til en kolonne i en data frame.
    • **my_data_frame$Sex** betyder, at vi vil bruge kolonnen Sex i **my_data_frame**.
    • Vi bruger kantede parenteser (**[]**) til at filtrere rækker, så alle Males beholdes.
    • I den kantede parentes skriver vi et komma (**,**) efter Males for at tydeliggøre, at det er rækker, vi filtrerer. Efter kommaet skrives intet, medmindre man også vil vælge kolonner).

Dette er et af mange eksempler på R-kode, som de fleste har svært ved at skrive og læse. Tidyverse indeholder pakker, der forenkler programmering i R. Faktisk gør tidyverse det muligt for hvem som helst at læse og skrive R-kode. Nedenfor følger den samme kode med dplyr, som er en af de pakker, der indgår i tidyverse:

filter(my_data_frame, Sex=="Males")

Koden ovenfor er let at skrive og let at forstå. For at installere tidyverse skriver du følgende kommando:

install.packages("tidyverse")

Dette vil downloade og installere tidyverse fra CRAN. Tidyversepackage indeholder flere pakker:

  • ggplot2
  • tibble
  • tidyr
  • readr
  • purrr
  • dplyr

3.2.0 Bioconductor: Pakker til medicinsk forskning

Bioconductor er sandsynligvis verdens mest anvendte software til beregninger og analyser inden for medicinsk grundforskning. Bioconductor består af et stort antal pakker, der er særligt udviklet til medicinsk forskning. Hele listen over pakker finder du her.

Installer pakker fra Bioconductor

Grundpakkerne i Bioconductor installeres med følgende kommando:

if (!require("BiocManager", quietly = TRUE))
    install.packages("BiocManager")
BiocManager::install()

Installer specifikke pakker, for eksempel “GenomicFeatures” og “AnnotationDbi”, med kommandoen:

BiocManager::install(c("GenomicFeatures", "AnnotationDbi"))

Hvis du har installeret Bioconductor, kan du også liste alle tilgængelige pakker med kommandoen:

BiocManager::available()

3.2.1 ROpenSci

ROpenSci består af erfarne forskere og softwareudviklere, som også udvikler pakker særligt til medicinsk forskning. Klik her for at se alle pakker.

Forsiden af rOpenSci med overskriften Transforming science through open data, software and reproducibility