Переименование объектов в среде r - PullRequest
1 голос
/ 22 марта 2019

Я бы хотел переименовать объекты в среде r.Например,

y1 <- vector('list', 3)

x1 <- matrix(0, 3, 3)
x2 <- matrix(1, 3, 3)
x3 <- matrix(2, 3, 3)

y1[[1]] <- x1
y1[[2]] <- x2
y1[[3]] <- x3

y2 <- vector('list', 3)

y2[[1]] <- x1
y2[[2]] <- x2
y2[[3]] <- x3

y <- new.env()
y$y1 <- y1
y$y2 <- y2

names(y)

names(y) <- c('a', 'b')

Я ожидал, что имя списков внутри y было a и b, то есть names(y) равно c('a', 'b'),

Obs.: Я не могу переименовать вручную переменные y1 и y2, мне нужно изменить их внутри среды.

Ответы [ 2 ]

1 голос
/ 22 марта 2019

Если вы не можете назначить их напрямую с правильным именем, то проще всего заменить среду на новую. Если вам абсолютно необходимо сохранить среду (поскольку на нее ссылаются где-то еще), вы можете заменить ее содержимое тем же приемом:

objs = mget(ls(env), env)
rm(list = ls(env), envir = env)
list2env(setNames(objs, new_names), env)

Соответствующая часть здесь является последним параметром list2env: если вы его отключите, это просто создаст новую среду. Если вы указываете существующую среду, к ней добавляются имена.

Этот код не затрагивает скрытые имена (то есть имена, начинающиеся с .) - чтобы изменить это, укажите аргумент all.names в ls или используйте names.

0 голосов
/ 22 марта 2019

R на самом деле не имеет встроенной операции для переименования переменных в любой среде. Вы можете написать простую вспомогательную функцию для этого.

env_rename <- function(e, new_names, old_names = names(e)) {
  stopifnot(length(new_names)==length(old_names)) 
  orig_val <- mget(old_names, envir=e)
  rm(list=old_names, envir=e)
  for(i in seq_along(old_names)) {
    assign(new_names[i], orig_val[[i]], envir=e)
  }
}

и назовите это с

env_rename(y, c("a","b"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...