Skapa och inspektera miljöer
Använd new.env(), environment(), ls() och get() för att arbeta med miljöer.
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 999Snabbkontroll
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=TRUEför stora lagringsmängderassign('x', v, envir=e)ochget('x', envir=e)för programmatisk åtkomste$xoche[['x']]fungerar som listaccessorerls(envir=e)listar namn;exists('x', envir=e, inherits=FALSE)för en strikt kontrollas.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')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
- Vad är en miljö i R?
- Regler för lexikal scopning
- Global kontra lokal scope
- Skapa och inspektera miljöer