R Academy · leksjon

Hva er et environment i R?

Utforsk environments som navngitte lister med pekere til foreldre.

Leksjon 1 av 413 trinn

Hva er et environment i R? er en gratis leksjon i R Academy på CoddyKit. Dette er leksjon 1 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i R Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i R Academy inneholder totalt 4 leksjoner.

Hva er et miljø?

I R er et miljø en samling navngitte bindinger, omtrent som en navngitt liste, samt en peker til et overordnet miljø. Alle variabler ligger i et miljø. Når R slår opp et navn, søker det først i det gjeldende miljøet og går deretter oppover i kjeden av overordnede miljøer.

# The global environment holds your session variables
x <- 42
cat('x is in globalenv:', exists('x', envir = globalenv()), '\n')
cat('globalenv name:', environmentName(globalenv()), '\n')

globalenv(), baseenv() og emptyenv()

R har flere innebygde miljøer: globalenv() er det interaktive arbeidsområdet, baseenv() inneholder basefunksjonene i R, og emptyenv() er toppen av kjeden uten noe overordnet miljø. Alle miljøkjeder ender til slutt i emptyenv().

cat('global    :', environmentName(globalenv()),  '\n')
cat('base      :', environmentName(baseenv()),    '\n')
cat('empty     :', environmentName(emptyenv()),   '\n')
cat('parent of global:', environmentName(parent.env(globalenv())), '\n')

Miljøkjeden

Hvert miljø har nøyaktig ett overordnet miljø, bortsett fra emptyenv(). Når R ikke finner et navn i det gjeldende miljøet, går det til det overordnede miljøet, deretter til dettes overordnede miljø, og så videre. Det er slik R finner variabelnavn.

# Walk the parent chain from globalenv
env <- globalenv()
for (i in 1:5) {
  cat(sprintf('Level %d: %s\n', i, environmentName(env)))
  if (identical(env, emptyenv())) break
  env <- parent.env(env)
}

environment() for en funksjon

Alle funksjoner har et tilknyttet miljø – miljøet de ble opprettet i. environment(f) returnerer dette miljøet. Dette er funksjonens omsluttende miljø og avgjør hvor den leter etter frie variabler.

f <- function() 'hello'
cat('f was defined in:', environmentName(environment(f)), '\n')

# Inside a function, environment() returns its own env
show_env <- function() {
  cat('my env:', environmentName(environment()), '\n')
}
show_env()

as.list() på et miljø

as.list(env) konverterer bindingene i et miljø til en navngitt liste, noe som er nyttig for å undersøke innholdet programmatisk. Hvis De kombinerer det med globalenv(), vises alle variablene i den gjeldende økten.

a <- 10
b <- 'hello'
c_val <- TRUE
# Show current global bindings as list
bindings <- as.list(globalenv())
cat('Names in globalenv:', paste(ls(globalenv()), collapse = ', '), '\n')

ls() – Liste over innholdet i et miljø

ls() viser navnene som er bundet i et miljø. Som standard viser den det globale miljøet. Angi envir = e for å undersøke et bestemt miljø. Legg til all.names = TRUE for å ta med navn som begynner med ..

my_env <- new.env(parent = emptyenv())
my_env$x <- 1
my_env$y <- 'two'
my_env$.hidden <- TRUE
cat('Default ls:', ls(envir = my_env), '\n')
cat('All names :', ls(envir = my_env, all.names = TRUE), '\n')

new.env() — Opprette miljøer

new.env(parent = e) oppretter et nytt, tomt miljø med den angitte forelderen. Bruk emptyenv() som forelder når De ønsker et fullstendig isolert miljø uten nedarvede bindinger.

e <- new.env(parent = emptyenv())
e$name  <- 'Alice'
e$score <- 95
cat('Names:', ls(e), '\n')
cat('Name binding:', e$name, '\n')

Miljøer kontra lister

Miljøer ligner navngitte lister, men oppfører seg annerledes: De endres alltid direkte (ingen kopiering ved endring), har en forelder, og navneoppslag gjøres ved hjelp av en hashtabell (raskt). Lister kopieres når de endres, mens miljøer ikke gjør det.

# Environments are reference objects (no copy-on-modify)
e <- new.env(parent = emptyenv())
e$x <- 1
f <- e        # f points to same env, not a copy
f$x <- 99
cat('e$x after modifying through f:', e$x, '\n')

exists() og get() i et miljø

exists('name', envir = e) kontrollerer om et navn er bundet i et miljø (eller i foreldrene som standard). get('name', envir = e) henter verdien. Begge godtar inherits = FALSE for å søke bare i det angitte miljøet.

e <- new.env(parent = emptyenv())
e$pi_approx <- 3.14159
cat('exists pi_approx:', exists('pi_approx', envir = e), '\n')
cat('exists missing:  ', exists('missing_var', envir = e), '\n')
cat('get pi_approx:   ', get('pi_approx', envir = e), '\n')

environmentName() for innebygde miljøer

environmentName(env) returnerer et lesbart navn på spesielle miljøer. Brukeropprettede miljøer returnerer '' (tom streng). Dette hjelper Dem med å spore hvor variabler ble definert under feilsøking.

cat(environmentName(globalenv()),    '\n')  # R_GlobalEnv
cat(environmentName(baseenv()),      '\n')  # package:base
cat(environmentName(emptyenv()),     '\n')  # R_EmptyEnv
e <- new.env(parent = emptyenv())
cat('User env name: "', environmentName(e), '"\n', sep = '')

Praktisk: Bruke miljøer som hurtigbuffer

Fordi miljøer endres direkte, egner de seg godt som mutable hurtigbuffere eller hashtabeller. Lagre beregnede resultater i et miljø for å unngå å beregne dem på nytt — dette er raskere enn å endre en liste (som kopieres).

cache <- new.env(parent = emptyenv(), hash = TRUE)
cached_square <- function(n) {
  key <- as.character(n)
  if (exists(key, envir = cache, inherits = FALSE))
    return(get(key, envir = cache))
  result <- n^2
  assign(key, result, envir = cache)
  result
}
cat(cached_square(7), '\n')
cat(cached_square(7), '\n')  # served from cache

Rask kontroll

Hva er miljøet øverst i R-kjeden av miljøer — det som ikke har noen forelder?

Miljøer: Viktigste punkter

Viktigste punkter om R-miljøer:

  • Et miljø = navngitte bindinger + peker til en forelder
  • globalenv() = arbeidsområdet Deres; baseenv() = base-R; emptyenv() = slutten på kjeden
  • Navneoppslag går oppover i foreldrekjeden til navnet blir funnet eller emptyenv() nås
  • ls(envir=e) viser bindinger; exists() kontrollerer; get() henter
  • Miljøer er referanseobjekter — ingen kopiering ved endring
  • new.env(parent=emptyenv()) oppretter et isolert miljø
e <- new.env(parent = emptyenv())
assign('counter', 0L, envir = e)
for (i in 1:5) assign('counter', e$counter + 1L, envir = e)
cat('Counter:', e$counter, '\n')
cat('Env name:', environmentName(e), '\n')
cat('Bindings:', ls(e), '\n')
Gratis å komme i gang

Lær deg R med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
43
Leksjoner
159

Ofte stilte spørsmål

Er leksjonen «Hva er et environment i R?» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien R Academy, inkludert «Hva er et environment i R?», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i R Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Hva er et environment i R?»?

Utforsk environments som navngitte lister med pekere til foreldre. Du øver på R Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med R Academy?

Ingen tidligere erfaring er nødvendig. R Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 4.

Hvor lang tid tar leksjonen «Hva er et environment i R?»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne R Academy-leksjonen?

Ja. Alle R Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Hva er et environment i R?
  2. Regler for leksikalsk scope
  3. Globalt kontra lokalt scope
  4. Opprette og inspisere environments
← Tilbake til R Academy