簡體   English   中英

如何通過 r 中的變量名稱對環境進行子集化

[英]How to subset an environment by its variable names in r

我想通過變量名稱對環境進行子集化。

e <- new.env(parent=emptyenv())
e$a <- 1
e$b <- 2
e$d <- 3
e[ls(e) %in% c("a","b", "c")]
### if e was a list, this would return the subset list(a=1, b=2)

我無法弄清楚如何按名稱對環境的元素進行子集化。 使用 lapply 或 eapply 也不起作用。 通過變量名稱對環境進行子集化的正確或簡單方法是什么? 謝謝。

好的,在仔細考慮之后,我可以建議:

mget(c("a","b"), envir=e)
#$a
#[1] 1
#
#$b
#[1] 2

我最初的解決方案是使用get() / mget() (也許 OP 之前看到了我刪除的評論)。 然后我注意到 OP 已經嘗試過eapply() ,所以我想到了可能的解決方案。 在這里(在@thelatemail 的幫助下)。

# try some different data type
e <- new.env(parent=emptyenv())
e$a <- 1:3
e$b <- matrix(1:4, 2)
e$c <- data.frame(x=letters[1:2],y=LETTERS[1:2])

您可以使用以下任一方法將環境e對象收集到列表中:

elst <- eapply(e, "[")  ## my idea
elst <- eapply(e, identity)  ## thanks to @thelatemail
elst <- as.list.environment(e)  ## thanks to @thelatemail

#$a
#[1] 1 2 3

#$b
#     [,1] [,2]
#[1,]    1    3
#[2,]    2    4

#$c
#  x y
#1 a A
#2 b B

as.list.environment()可以看作是list2env()的逆操作。 它在?list2env的“另請參見”部分中?list2env

結果elst只是一個普通的列表。 有多種方法可以對這個列表進行子集化。 例如:

elst[names(elst) %in% c("a","b")]  ## no need to use "ls(e)" now

#$a
#[1] 1 2 3

#$b
#     [,1] [,2]
#[1,]    1    3
#[2,]    2    4
mget(ls(e)[ls(e) %in% c('a','b','d')], e)

[運算符通常返回與原始對象相同類型的對象,所以我猜你期待的是一個環境,而不是一個列表。 相同的環境但具有不同的元素集,還是具有指定元素的新環境? 無論哪種方式,我認為你最終會迭代,例如,

f = new.env(parent=emptyenv())
for (elt in c("a", "b"))
    f[[elt]] = e[[elt]]

使用環境並不是非常慣用的 R 代碼,這可以解釋為什么沒有更優雅的解決方案。

您可以使用 rlang::env_get_list() 獲取綁定列表:

rlang::env_get_list(env=e, c("a","b"))

#$a
#[1] 1
#
#$b
#[1] 2

如果你想獲得一個環境而不是一個列表,我不知道你會怎么做,除了使用 rlang::env_get_list() 的輸出創建一個新環境。

如果要在列表中包含環境中可能不存在的元素(如“c”),則必須指定默認值 - 否則會出現錯誤:

env_get_list(env = e, c("a","b","c"))
#Error in env_get_list(env = e, c("a", "b", "c")) : argument "default" is missing, with no default

env_get_list(env = e, c("a","b","c"),default=NULL)
#$a
#[1] 1
#
#$b
#[1] 2
#
#$c
#NULL

我假設你根本不想要 c,所以我會做這樣的事情:

temp <- c("a","b","c")[c("a","b","c") %in% env_names(e)]
temp
[1] "a" "b"

env_get_list(env=e,temp)
#$a
#[1] 1
#
#$b
#[1] 2

暫無
暫無

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

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