22 setembro, 2021

Selo DC

Introdução

  • Ambiente envolvente (ambiente de função)
  • Ambiente de ligação
  • Ambiente de execução
  • Ambiente de chamada

Ambiente envolvente e Ambiente de ligação

Código

# Criando o ambiente 'amb1'
amb1 <- new.env()
# Objeto x em 'amb1'
amb1$x <- 1
# Objeto x no ambiente global
x <- 2
# Criando a funcao 'h' em 'amb1'
amb1$h <- function() x
# chamando a funcao h()
amb1$h()
## [1] 2
# vericando o id de memoria de amb1
amb1 # ou .Internal(address(amb1))
## <environment: 0x00000000095f6730>
# Ambiente envolvente de 'h'
environment(amb1$h)
## <environment: R_GlobalEnv>

Ambiente de Execução (Exemplo 1)

# Criando a funcao f1
f1 <- function() 1
# Verificando o ambiente envolvente de f1
environment(f1)
## <environment: R_GlobalEnv>
# Criando uma funcao f
f <- function() {
  # ambiente de execucao
  cat("Ambiente de execucao de f: \n")
  print(environment())
  # Criando uma funcao f2
  f2 <- function() 2
  # Verificando o ambiente envolvente de f2
  cat("Ambiente envolvente de f2:\n")
  print(environment(f2))
}
f()
## Ambiente de execucao de f: 
## <environment: 0x0000000007687688>
## Ambiente envolvente de f2:
## <environment: 0x0000000007687688>

Ambiente de execução (Exemplo 2)

Ambiente de chamada e o escopo dinâmico

# Fabrica de funcoes
h <- function() {
  x <- 1
  function() {
    amb_envolvente <- get("x", environment())
    amb_chamada <- get("x", parent.frame())
    list(envolvente = amb_envolvente, chamada = amb_chamada)
  }
}
# Funcao g
g <- h()
# Definindo 'x' no ambiente global
x <- 20
# Chamada de g(), e verificando 'x' no ambiente de envolvente e de chamada
g()
## $envolvente
## [1] 1
## 
## $chamada
## [1] 20

Bons estudos!