R: копировать/перемещать одну среду в другую - программирование
Подтвердить что ты не робот

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, заранее

4b9b3361

Ответ 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))