2016-09-10 39 views
1

假設我有一個名爲列表像如何從指定列表中刪除元素而無需分配?

somelist <- list(a = 1, b = 5, c = 3) 

我知道我可以刪除somelist$b,比如說,通過分配NULL它:

somelist$b <- NULL 

我想這是好的交互工作,但不非常適合編程工作,因爲它會強制創建其他多餘的變量。


例如,假設foo(42)計算結果爲類似於somelist列表的上方,並且我想通過從foo(42)落下b元件的一些其它功能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

你可以嘗試'bar(foo(42)[setdiff(names(somelist),「b」)])' – akrun

+2

不相關,但是'bar'用命名元素接受一個「列表」並執行提取項目的操作?在它的定義中有明確的'bar'參數不是更方便嗎? –

回答

8

你可以在飛行中是去除與replace()

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

它適用於多個變量,以及...

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

所以只是包裝,在bar()和原始列表保持不變。

注意:我不完全確定你在做什麼與foo(42),但你聲明產生的列表採用類似的結構,所以這應該是罰款。

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