重命名环境r中的对象

重命名环境r中的对象,r,environment-variables,R,Environment Variables,我想在environment 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[[

我想在environment 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')

y1R实际上没有在任何环境中重命名变量的内置操作。您可以编写一个简单的助手函数来实现这一点

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)
  }
}

如果不能直接用正确的名称分配它们,那么最简单的方法就是用一个新的环境替换环境。如果您确实需要保留环境(因为它在别处被引用),可以使用相同的技巧替换其内容:

objs = mget(ls(env), env)
rm(list = ls(env), envir = env)
list2env(setNames(objs, new_names), env)
此处的相关部分是
list2env
的最后一个参数:如果您将其禁用,这只会创建一个新环境。如果指定现有环境,则会将名称添加到该环境中


此代码将保留隐藏名称(即以
开头的名称)不变-若要更改此设置,请将
all.names
参数提供给
ls
,或使用
names

您真的需要
环境
,还是
列表
可以完成此工作? 如果是这样,您可以轻松重命名列表项:

...
...
y=list()
y$y1 <- y1
y$y2 <- y2
names(y)=c('a','b')
names(y)
[1] "a" "b"

我的意思是,如果要重命名它们,首先为什么要将它们指定为
y1
y2
?因为否则最简单的方法就是简单地将它们分配为
y$a
y$b
...
...
y=list()
y$y1 <- y1
y$y2 <- y2
names(y)=c('a','b')
names(y)
[1] "a" "b"
acao
[1] "PETR4.SA" "VALE3.SA" "ITUB4.SA"
require(quantmod)
e1=new.env()
x=getSymbols(acao,env=e1) 
e1=as.list(e1)
names(e1)
[1] "ITUB4.SA" "VALE3.SA" "PETR4.SA"
names(e1)=sub('.SA$','',names(e1))
names(e1)
[1] "ITUB4" "VALE3" "PETR4"