Contexto mais amplo:
Gostaria de criar uma função que liste todas as variáveis do corpo da função especificada e imprima de qual ambiente ela vem.
Abaixo está um exemplo da função com variáveis dos novos ambientes.
g2 <- function() {
print(cc)
print(dd)
print(ee)
}
e <- new.env(parent = globalenv())
e$cc <- "Hello from the new environment"
e$dd <- "Hello from the new environment2"
environment(g2) <- e
e2 <- new.env(parent = globalenv())
e2$dd <- "Hello from the new environment"
e2$ee <- "Hello from the new environment2"
environment(g2) <- e2
Já cheguei ao ponto de armazenar todas as variáveis em um vetor: symbols <- c("cc","dd","ee")
, usar ambientes em um segundo vetor: envirs <- ls()[sapply(ls(), function(x) is.environment(get(x)))]
e verificar de qual ambiente veio a variável: xin <- sapply(envirs, function(x) sapply(symbols, function(y) exists(y,get(x))))
. E fica assim:
> xin
e e2
cc TRUE FALSE
dd TRUE TRUE
ee FALSE TRUE
e
> e
<environment: 0x00000127b2a1e1a8>
> e2
<environment: 0x00000127b2a20988>
Agora eu gostaria que ficasse assim:
Symbol Definition
1 cc <environment: 0x00000127b2a1e1a8>
2 dd <environment: 0x00000127b2a1e1a8>, <environment: 0x00000127b2a20988>
3 ee <environment: 0x00000127b2a20988>
Mas não sei como conseguir quando xin
está neste formato. Quando verifico apenas um símbolo, por exemplo, “dd” em todos os ambientes, consigo obter este resultado:
xin <- sapply(envirs, function(x) exists("dd",get(x)))
l <- sapply(envirs[xin], function(x) get(x))
data.frame(t(sapply(l,c)))
e e2
1 <environment: 0x00000127b2a1e1a8> <environment: 0x00000127b2a20988>
Estou empenhado em resolver isso exclusivamente com o pacote base! , mas também estou aberto a outras soluções.