R 删除()中的多个命名列表组件

R 删除()中的多个命名列表组件,r,list,null,with-statement,named,R,List,Null,With Statement,Named,我正在尝试使用中的和rm从列表中删除命名组件。这适用于单个组件,但不适用于两个或更多组件。我完全糊涂了 例如,这是有效的 aa = list(a = 1:3, b = 2:5, cc = 1:5) within(aa, {rm(a)}) 中的输出将仅包含未移除的组件 然而,这并不是: aa = list(a = 1:3, b = 2:5, cc = 1:5) within(aa, {rm(a); rm(b)}) 这也不是: within(aa, {rm(a, b)}) 中的输出将所有组件(

我正在尝试使用
中的
rm
从列表中删除命名组件。这适用于单个组件,但不适用于两个或更多组件。我完全糊涂了

例如,这是有效的

aa = list(a = 1:3, b = 2:5, cc = 1:5)
within(aa, {rm(a)})
的输出将仅包含未移除的组件

然而,这并不是:

aa = list(a = 1:3, b = 2:5, cc = 1:5)
within(aa, {rm(a); rm(b)})
这也不是:

within(aa, {rm(a, b)})

的输出将所有组件(包括我试图删除的组件)设置为
NULL
。为什么?

首先,请注意以下行为:

> aa = list(a = 1:3, b = 2:5, cc = 1:5)
>
> aa[c('a', 'b')] <- NULL
>
> aa
# $cc
# [1] 1 2 3 4 5

> aa = list(a = 1:3, b = 2:5, cc = 1:5)
>
> aa[c('a', 'b')] <- list(NULL, NULL)
>
> aa
# $a
# NULL
#
# $b
# NULL
#
# $cc
# [1] 1 2 3 4 5

请特别注意函数的第二行到最后一行。如果列表中已删除的项目数大于1,则该函数实际上是在调用
aa[c('a','b')]哦,是的。但我试着在里面做这是奇怪的行为!您可以删除其中一列,但在删除之后,它们将保持为空-即使有3列以上。在(aa,{“b”啊,是的。应该考虑查看源代码。非常感谢!这非常简洁,但是为什么需要从
in.list
中删除else子句?假设它是一个bug,请在
base::in
中提交一个R bug
within.list <- function (data, expr, ...) 
{
    parent <- parent.frame()
    e <- evalq(environment(), data, parent)
    eval(substitute(expr), e)
    l <- as.list(e)
    l <- l[!sapply(l, is.null)]
    nD <- length(del <- setdiff(names(data), (nl <- names(l))))
    data[nl] <- l
    if (nD) 
        data[del] <- if (nD == 1) NULL else vector("list", nD)
    data
}
mywithin <- function (data, expr, ...) 
{
    parent <- parent.frame()
    e <- evalq(environment(), data, parent)
    eval(substitute(expr), e)
    l <- as.list(e)
    l <- l[!sapply(l, is.null)]
    nD <- length(del <- setdiff(names(data), (nl <- names(l))))
    data[nl] <- l
    if (nD) data[del] <- NULL
    data
}
> aa = list(a = 1:3, b = 2:5, cc = 1:5)
>
> mywithin(aa, rm(a, b))
# $cc
# [1] 1 2 3 4 5