Pakkehåndtering i R
R-pakken, renv
, er et verktøy som lar oss opprette et miljø for R og installere pakker. Det er anbefalt å bruke renv for å sikre at alle som jobber med prosjektet har samme versjon av pakkene. I tillegg er det enkelt å dele prosjektet med andre.
Hvor skal jeg kjøre kommandoer for renv?
Når du oppretter et renv-miljø, installerer eller oppdaterer pakker må du kjøre noen kommandoer. Hvor disse skal kjøres er avhengig av om du bruker RStudio, eller Jupyter.
I jupyter anbefaler vi at du oppretter renv-miljøet og installerer pakker fra R i terminalen. For å starte R i terminalen:
- Åpne en terminal fra Launcher
- Stå i mappen der du vil aktivere det virtuelle miljøet/installere pakker, dvs. prosjekt mappen.
- Starte R ved å skrive in
R
Her er en kort video (uten lyd) for å vise dette:
I Rstudio kan du fint kjøre kommandoene direkte i console. Du finner console vanligvis nederste på venstre i RStudio.
Starte renv i et eksisterende prosjekt
For å installere R-pakker må du opprette et renv-miljø med renv. Dette kan gjøres ved å kjøre:
::init() renv
For å opprette et renv-miljø i Jupyter, navigere først til hovedmappen for prosjektet i terminalen og starter R. Etterpå, kan du kjøre renv::init()
.
Initialisere renv-miljø i RStudio med renv::init()
i console.
For at renv skal fungere i RStudio er det viktig å jobbe i et R-project. Dvs. at du har en prosjekt-fil (.Rproj) i GitHub repoen din.
Hvis du ikke har det, kan du opprette en ved å velge File > New Project… > Version Control > Git > og lim inn git adressen for å clone ned repoen på nytt. Da vil det også kommer en .Rproj fil. Denne kan fint ligger på repoen.
Kommandoen renv::init()
setter opp et renv-miljø i mappen du står i. Hvis du jobber i Jupyter, sjekk at du står i root av repoen (hovedmappen til repository).
Rent praktisk vil det si at du fikk følgende filer/mapper i mappen din:
renv.lock
En fil som inneholder versjoner av alle pakker du benytter i koden din..Rprofile En fil som inneholder informasjon om oppsetting av miljø.
renv
Mappe som inneholder alle pakkene du installerer.renv/activate.R En fil som aktiverer renv miljøet for et prosjekt.
Ta i bruk renv-miljø
For å ta i bruk et renv-miljø må det aktiveres før koden kjøres. Dette gjøres automatisk i både Jupyter og RStudio ved hjelp av renv/activate.R filen.
For at renv-miljø kan brukes i Jupyter må også følgende pakke installeres.
For å åpne .R filer som notebooks i det nye renv-miljø må pakken IRkernel være installert hvis du jobber i Jupyter. Dette er ikke automatisk installert ved oppstart av et nytt renv-miljø. Du kan installere dette ved å kjøre
::install("IRkernel") renv
For at denne pakken skal være med i .lock-filen må det brukes et sted med for eksempel library(IRkernel)
og lagres til renv.lock med renv::snapshot()
-funksjonen (se lengere ned for detaljer)
Tidligere må også alle R-filene starte med renv::autoload()
i Jupyter på Dapla. Dette er ikke nødvendig lenge med bruk av .R-filer, istedenfor .ipynb. Det er fortsatt nødvendig i produksjonssone (bakke-miljø).
Installering av pakker
Vi installerer pakker med funksjonen renv::install()
. For eksempel, for å installere pakken PxWebApiData:
::install("PxWebApiData") renv
For å installere R-pakker som ligger på ‘statisticsnorway’ området på GitHub må det spesifiseres foran pakkenavnet:
::install("statisticsnorway/ssb-klassr") renv
For å installere en spesifikk versjon av en pakke kan du spesifisere dette med installering med @
og versjonsnummer. For eksempel å installere PxWEbApiData
versjon 0.4.0:
::install("PxWebApiData@0.4.0") renv
For å lagre versjonsnummer av de nye pakkene som er installerte til renv.lock filen, kjør:
::snapshot() renv
Dele prosjektet og renv-miljøet med andre
Før du deler prosjektet forsikre det om at renv.lock-filen er oppdatert. Dette kan gjøres ved å kjøre renv::snapshot()
.
For at en pakke skal lagres i renv.lock må pakken benyttes ved library()
et sted i prosjektet (på en .R eller .ipynb fil).
For å dele renv-miljøet som en del av prosjektet skal følgende filene være på github: renv.lock, .Rprofile og renv/activate.R
Ta i bruk et prosjekt og renv-miljø fra andre
Hvis prosjektet er opprettet av noen andre, og har blitt delt med deg, kan alle pakkene i prosjektet installeres samtidig. Clone repository kjør følgende for å installere alle nødvendige pakker:
:restore() renv
Avinstallering
Individuelle pakker kan fjernes fra renv-miljøet ved renv::remove()
-funksjonen. For eksempel:
::remove("PxWebApiData") renv
For å fjerne fra renv.lock-filen også må du ta en snapshot()
etterpå.
::snapshot() renv
En annen nyttig funksjon er renv::clean()
. Dette fjerner alle pakker fra library som ikke er i bruk
::clean() renv
Igjen må du ta en snapshot()
for at endringer skal lagres på renv.lock-filen
Oppgradere pakker
For å oppgradere en pakke kan du bruke renv::update()
. For eksempel, for å oppgradere PxWebApiData
skriv:
::update("PxWebApiData") renv
Husk å ta en snapshot()
etterpå for å lagre endringer til renv.lock-filen. Det betyr at du og andre kan gjenskape miljøet på nytt.
::snapshot() renv
Oppgradering av R (kun produksjonssone på bakken)
Versjonen av R i produksjonssone oppgraderes jevnlig, i både Jupyter og RStudio. Dette er fordi operativsystemet og programmer som R er avhengig skal holdes oppdatert. For at R skal fungere optimalt må det oppgraderes ofte. Dette skaper noen utfordringer for renv-miljøer som er avhengig av en spesifikk versjon av R.
Hvis du plutselig får en feilmelding ved oppstart at R-versjonen er forskjellig fra det den som er oppgitt renv.lock-filen, har det trolig vært en oppgradering av R siden sist noen jobbet med koden. Følg denne oppskriften for å løse opp i problemene:
Kjør følgende kommandoer i R i terminal (Jupyter) eller i console (RStudio)
- Oppgrader versjon av renv ved:
terminal
::upgrade() renv
- Oppgrader alle pakkene ved:
terminal
::hydrate(update = "all") renv
- Lagre renv.lock filen:
terminal
::snapshot() renv
For mer informasjon kan du lese denne artikkelen om oppdatering av renv her
Ta det lang tid til å starte et renv-miljø?
Ved å aktivere et renv-miljø ved oppstart, søker R i alle programfiler for å sjekke at alle pakker som benyttes er installerte. Hvis du har en veldig stor repository kan dette ta lang tid. En løsning er å opprette en .renvignore fil som spesifisere hvilke filer skal ignoreres. For eksempel om alle R kode ligger i .R filer kan .renvignore inneholder linjen *.ipynb
for å ignorere all notebookene om de finnes.
Flytting mellom Jupyter på bakken og Dapla
R-pakker installeres fra ulike sted når vi jobber på Dapla vs produksjonssone på bakken. For å bruke et renv-miljø i en repo som var laget på bakken, på Dapla, må vi endre adressen hvor pakkene skal installeres fra i renv.lock. Addressen skal se slik ut:
renv.lock
"Repositories": [
{
"Name": "CRAN",
"URL": "https://packagemanager.posit.co/cran/latest"
}
]
Kjøring mellom RStudio og Jupyter (prodsone)
Hvis du bytter mellom Jupyter og RStudio i prodsone, må du også endre adressen hvor pakkene skal installeres fra i renv.lock-filen. Disse to miljø kan har ulike versjoner av R og/eller ulike adresser å hente pakker fra. Det er anbefalt å holde deg til Jupyter eller RStudio om mulig.
Hvordan å løse problemer med pakkeinstallering i produksjonssone på bakken
Prosessen med å installere R-pakker på bakken er det samme som på Dapla. Noen pakker (for eksempel arrow
og ROracle
) kan være vanskelig å installere på grunn av 3. parti avhengigheter.
arrow
Hvis du sliter med installering av arrow
kan du prøve å spesifisere versjonen som skal installeres. Det er foreløpige ulike versjoner av avhengigheter i RStudio og Jupyter pga de ulike systemer og oppsett.
::install("arrow@18.1.0.1") renv
Pakken er ganske stor, så det kan ta tid å installere den.
::install("arrow@17.0.0.1") renv
Pakken er ganske stor, så det kan ta tid å installere den.
ROracle
Pakken ROracle
har systemavhengigheter som betyr at det kan være vanskelig å installere i produksjonssone på bakken i et renv-miljø. Hvis du opplever problemer, prøv å installere pakken fra en lokal versjon med følgende kommando i R:
<- "/ssb/bruker/felles/R_pakker/ROracle_1.4-1_R_x86_64-unknown-linux-gnu.tar.gz"
ROracle_pakke
install.packages(
ROracle_pakke,repos = NULL,
type = "source")