假设我有一个像
这样的命名列表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
函数?
答案 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