R Academy · Lektion

Skapa och inspektera miljöer

Använd new.env(), environment(), ls() och get() för att arbeta med miljöer.

Lektion 4 av 413 steg

Skapa och inspektera miljöer är en gratis lektion i R Academy på CoddyKit. Detta är lektion 4 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för R Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i R Academy innehåller totalt 4 lektioner.

Skapa en ny miljö

new.env(parent = e) skapar en ny tom miljö. Argumentet parent anger vilken miljö som ska genomsökas när ett namn inte hittas i den nya miljön. Använd emptyenv() för en helt isolerad miljö.

# Isolated environment (no parent chain)
e1 <- new.env(parent = emptyenv())
# Environment with global as parent
e2 <- new.env(parent = globalenv())
cat('e1 parent:', environmentName(parent.env(e1)), '\n')
cat('e2 parent:', environmentName(parent.env(e2)), '\n')

assign() — lägga till bindningar

assign('name', value, envir = e) skapar eller uppdaterar en namngiven bindning i den angivna miljön. Det är den programmatiska motsvarigheten till e$name <- value, men fungerar när namnet lagras i en variabel.

e <- new.env(parent = emptyenv())
assign('x', 10, envir = e)
assign('y', 'hello', envir = e)
assign('z', TRUE, envir = e)
cat('x:', get('x', envir = e), '\n')
cat('y:', get('y', envir = e), '\n')

get() och mget()

get('name', envir = e) hämtar en enskild bindning. mget(c('a','b'), envir = e) hämtar flera bindningar samtidigt och returnerar en namngiven lista. Båda ger ett fel om namnet inte finns (såvida inherits inte tillåter sökning genom kedjan).

e <- new.env(parent = emptyenv())
e$alpha <- 1
e$beta  <- 2
e$gamma <- 3
# Single
get('alpha', envir = e)
# Multiple
mget(c('alpha', 'beta', 'gamma'), envir = e)

ls() — lista bindningar

ls(envir = e) returnerar en teckenvektor med alla namn som är bundna i miljön e. Lägg till all.names = TRUE för att även ta med namn som börjar med . (dolda som standard). Namnen returneras i alfabetisk ordning.

e <- new.env(parent = emptyenv())
e$b_val  <- 2
e$a_val  <- 1
e$.secret <- 'hidden'
cat('Default ls:', ls(envir = e), '\n')
cat('All names :', ls(envir = e, all.names = TRUE), '\n')

exists() med inherits

exists('name', envir = e, inherits = FALSE) kontrollerar endast den angivna miljön, inte dess överordnade miljöer. Med inherits = TRUE (standard) söker den även genom den överordnade kedjan. Använd inherits = FALSE för strikt lokala kontroller.

parent_e <- new.env(parent = emptyenv())
parent_e$shared <- 42
child_e  <- new.env(parent = parent_e)
# inherits=TRUE: finds shared in parent
cat('inherits TRUE:', exists('shared', envir = child_e, inherits = TRUE),  '\n')
# inherits=FALSE: only looks in child
cat('inherits FALSE:', exists('shared', envir = child_e, inherits = FALSE), '\n')

environmentName() och parent.env()

environmentName(e) returnerar namnet på en inbyggd miljö ('R_GlobalEnv', 'package:base' och så vidare). Egenskapade miljöer returnerar ''. parent.env(e) returnerar miljöobjektet för den överordnade miljön.

e <- new.env(parent = globalenv())
cat('Name of e     :', environmentName(e), '\n')
cat('Parent of e   :', environmentName(parent.env(e)), '\n')
cat('Name of global:', environmentName(globalenv()), '\n')

$-syntax för miljöer

Miljöer stöder syntaxen $ och [[, precis som listor, för att läsa och skriva bindningar. Detta är ofta smidigare än get()/assign() för direkt åtkomst när namnet är känt vid skrivtillfället.

e <- new.env(parent = emptyenv())
e$pi_approx <- 3.14159
e[['e_approx']] <- 2.71828
cat('pi:', e$pi_approx, '\n')
cat('e :', e[['e_approx']], '\n')

rm() i en specifik miljö

rm('name', envir = e) tar bort en bindning från en specifik miljö. Detta skiljer sig från att ta bort en global variabel — Ni måste ange miljön uttryckligen när Ni arbetar med anpassade miljöer.

e <- new.env(parent = emptyenv())
e$keep <- 1
e$remove_me <- 99
cat('Before:', ls(envir = e), '\n')
rm('remove_me', envir = e)
cat('After :', ls(envir = e), '\n')

as.list() för att tömma en miljö

as.list(e) konverterar alla bindningar i en miljö till en namngiven lista, vilket gör det enkelt att inspektera eller serialisera innehållet. Resultatet är en ögonblicksbild — senare ändringar i miljön återspeglas inte i listan.

e <- new.env(parent = emptyenv())
e$x <- 10
e$y <- 20
e$z <- 30
bindings <- as.list(e)
cat('Class:', class(bindings), '\n')
cat('Length:', length(bindings), '\n')
str(bindings)

Miljöer som hashtabeller

Alternativet hash = TRUE i new.env() (standard när en överordnad miljö anges) aktiverar hashbaserad uppslagning, vilket ger namnuppslagning i O(1). Därför är stora miljöer mycket snabbare än listor för lagring av nyckel–värde-par.

# Build a small key-value store
store <- new.env(hash = TRUE, parent = emptyenv())
keys   <- paste0('key_', 1:5)
values <- c(10, 20, 30, 40, 50)
for (i in seq_along(keys)) assign(keys[i], values[i], envir = store)
# Retrieve
cat('key_3 =', get('key_3', envir = store), '\n')
cat('All keys:', ls(store), '\n')

Kopiera kontra dela miljöer

Att tilldela en miljö till en ny variabel kopierar den inte – båda variablerna refererar till samma objekt. Använd as.list() och sedan list2env() för att skapa en faktisk kopia om Ni behöver fristående miljöer.

e1 <- new.env(parent = emptyenv())
e1$val <- 100
e2 <- e1          # reference, not a copy
e2$val <- 999
cat('e1$val:', e1$val, '\n')  # 999, modified via e2!

# True copy:
e3 <- list2env(as.list(e1), parent = emptyenv())
e3$val <- 0
cat('e1$val after e3 change:', e1$val, '\n')  # still 999

Snabbkontroll

Vilken funktion kontrollerar om ett namn är bundet i en miljö utan att söka i dess överordnade miljöer?

Skapa miljöer: viktiga slutsatser

Viktiga slutsatser om att skapa och inspektera miljöer:

  • new.env(parent=e) skapar en ny tom miljö; hash=TRUE för stora lagringsmängder
  • assign('x', v, envir=e) och get('x', envir=e) för programmatisk åtkomst
  • e$x och e[['x']] fungerar som listaccessorer
  • ls(envir=e) listar namn; exists('x', envir=e, inherits=FALSE) för en strikt kontroll
  • as.list(e) omvandlar till en lista; list2env() återskapar miljön
  • Miljöer är referensobjekt – tilldelning delar, men kopierar inte
config <- new.env(hash = TRUE, parent = emptyenv())
assign('host', 'localhost', envir = config)
assign('port', 5432L,       envir = config)
assign('db',   'mydb',      envir = config)
cat('Keys  :', ls(config), '\n')
cat('host  :', config$host, '\n')
cat('port  :', config$port, '\n')
Gratis att börja

Lär dig R med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
43
Lektioner
159

Vanliga frågor

Är lektionen ”Skapa och inspektera miljöer” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen R Academy, inklusive ”Skapa och inspektera miljöer”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i R Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Skapa och inspektera miljöer”?

Använd new.env(), environment(), ls() och get() för att arbeta med miljöer. Ni övar på R Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig R Academy?

Du behöver inga förkunskaper. Utbildningen i R Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.

Hur lång tid tar lektionen ”Skapa och inspektera miljöer”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här R Academy-lektionen?

Ja. Varje R Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Vad är en miljö i R?
  2. Regler för lexikal scopning
  3. Global kontra lokal scope
  4. Skapa och inspektera miljöer
← Tillbaka till R Academy