R: копировать/перемещать одну среду в другую
Я хотел бы спросить, возможно ли скопировать/переместить все объекты одной среды в другую, сразу. Например:
f1 <- function() {
print(v1)
print(v2)
}
f2 <- function() {
v1 <- 1
v2 <- 2
# environment(f1)$v1 <- v1 # It works
# environment(f1)$v2 <- v2 # It works
environment(f1) <- environment(f2) # It does not work
}
f2()
f1()
TNX, заранее
Ответы
Ответ 1
Кажется, что вы можете сделать как минимум 3 разных вещи:
- Клонировать среду (создать точный дубликат)
- Скопировать содержимое одной среды в другую среду.
- Поделитесь той же средой
Клонировать:
# Make the source env
e1 <- new.env()
e1$foo <- 1
e1$.bar <- 2 # a hidden name
ls(e1) # only shows "foo"
# This will clone e1
e2 <- as.environment(as.list(e1, all.names=TRUE))
# Check it...
identical(e1, e2) # FALSE
e2$foo
e2$.bar
Чтобы скопировать содержимое, вы можете сделать то, что показал @gsk. Но опять-таки, флаг all.names
полезен:
# e1 is source env, e2 is dest env
for(n in ls(e1, all.names=TRUE)) assign(n, get(n, e1), e2)
Чтобы поделиться средой, это то, что сделал @koshke. Это, вероятно, часто гораздо более полезно. Результат такой же, как при создании локальной функции:
f2 <- function() {
v1 <- 1
v2 <- 2
# This local function has access to v1 and v2
flocal <- function() {
print(v1)
print(v2)
}
return(flocal)
}
f1 <- f2()
f1() # prints 1 and 2
Ответ 2
Попробуйте следующее:
f2 <- function() {
v1 <- 1
v2 <- 2
environment(f1) <<- environment()
}
Ответ 3
Можно использовать назначение:
f1 <- function() {
print(v1)
print(v2)
}
f2 <- function() {
v1 <- 1
v2 <- 2
for(obj in c("v1","v2")) {
assign(obj,get(obj),envir=f1.env)
}
}
Если вы не хотите перечислять объекты, ls()
принимает аргумент среды.
И вам придется выяснить, как заставить f1.env быть средой, указывающей внутри f1: -)
Ответ 4
Я использую эту функцию в своем пакете для копирования объектов:
copyEnv <- function(from, to, names=ls(from, all.names=TRUE)) {
mapply(assign, names, mget(names, from), list(to),
SIMPLIFY = FALSE, USE.NAMES = FALSE)
invisible(NULL)
}
Ответ 5
Для этого:
environment(f1) <- environment(f2) # It does not work
Откройте среду f1
и выполните следующие действия:
ls(load(f2))