簡體   English   中英

重命名環境 r 中的對象

[英]Rename objects in environment r

我想重命名環境 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中的列表名稱是ab ,即names(y)等於c('a', 'b')

觀察:我無法手動重命名變量y1y2 ,我需要在環境中更改它們。

如果您不能直接為它們分配正確的名稱,那么最簡單的方法是用新的環境替換環境。 如果您絕對需要保留環境(因為它在其他地方被引用),您可以使用相同的技巧替換其內容:

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

這里的相關部分是list2env的最后一個參數:如果你不使用它,這只會創建一個新環境。 如果您指定現有環境,則會將名稱添加到該環境中。

此代碼將保留隱藏名稱(即以.開頭的名稱)不變 - 要更改此設置,請向ls提供all.names參數,或使用names

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

你真的需要一個environment ,或者一個list可以完成這項工作嗎? 如果是這樣,您可以輕松重命名列表項:

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

我有相反的問題: getSymbols將結果放在一個environment ,我將其更改為一個list以重命名它們:

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"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM