如何在没有赋值的情况下从命名列表中删除元素?

时间:2016-09-10 18:24:37

标签: r

假设我有一个像

这样的命名列表
somelist <- list(a = 1, b = 5, c = 3)

我知道我可以删除somelist$b,例如,为其分配NULL

somelist$b <- NULL

我认为这对于交互式工作来说很好,但对于程序化工作来说并不是很好,因为它会强制创建其他多余的变量。

例如,假设foo(42)评估为与上面的somelist类似的列表,并且我希望通过从b删除foo(42)元素而得到的列表到其他一些函数bar。在这种情况下,应用上面显示的方法需要以下内容:

superfluous.variable <- foo(42)
superfluous.variable$b <- NULL
bar(superfluous.variable)
rm(superfluous.variable)

我正在寻找一种方法,可以从bar传递foo不需要这些多余任务的修改结果。上面的四行将折叠成一行:

bar(drop.item.from.list(foo(42), item.to.drop = "b"))

R是否已经具有上述假设的drop.item.from.list函数?

2 个答案:

答案 0 :(得分:8)

您可以使用replace()

动态删除
replace(somelist, "b", NULL)
# $a
# [1] 1
#
# $c
# [1] 3

它适用于多个变量......

replace(somelist, c("a", "b"), NULL)
# $c
# [1] 3

所以只需将其包裹在bar()中,原始列表保持不变。

注意:我不确定你在使用foo(42)做了什么,但是你声明结果列表采用了类似的结构,所以这应该没问题。

答案 1 :(得分:3)

我们可以尝试setdiff

bar(foo(42)[setdiff(names(somelist), "b")])

作为setdiff子集'somelist'

somelist[setdiff(names(somelist), "b")]
#$a
#[1] 1

#$c
#[1] 3

我们也可以将它用于多个变量的子集

somelist[setdiff(names(somelist), c("a", "b"))]
#$c
#[1] 3