2016-04-24 106 views
1

說你在你的[R環境中的對象,如:如何將參數值列表應用於R中的函數?

a <- 4 
b <- 3 
c <- 2 
aa <- 2 
bb <- 6 
cc <- 9 

現在說你想刪除其名字以字母「A」或「B」在你的環境中的對象。這可以用

rm(list = ls(pattern = "a")) 
rm(list = ls(pattern = "b")) 

不過來實現,試想一下來解決一個更大的規模這個問題,你想刪除其值出現在列表中,如所有對象:

custom <- list("a", "b") 

如何我是否將此列表應用於ls()函數的「循環」參數?

我已經嘗試:

rm(lapply(custom, function(x) ls(pattern = x))) 

但是,這似乎並沒有做任何事情。

這感覺就像是一個很常見的問題,所以我擔心這個問題在stackoverflow的其他地方有答案。不幸的是我找不到它。

+1

建議使用較不容易複製的名稱編輯此問題,以便人們不會無意中從環境中刪除具有字母a或b的其他對象。 – dww

回答

2

選項1:這是一種矢量化方法。使用「或」正則表達式分隔符(|)將custom列表粘貼在一起,並將其傳遞給pattern

rm(list = ls(pattern = paste(custom, collapse = "|"))) 

選項2:如果您仍想使用lapply(),你必須包括兩個ls()rm()envir說法,因爲lapply()本身形成了一個當地的環境。並且您還想將rm()撥入lapply()電話。

lapply(custom, function(x) { 
    e <- .GlobalEnv 
    rm(list = ls(pattern = x, envir = e), envir = e) 
}) 
0

也許grep將解決你的問題:

rm(list=grep("^[ab]$", ls(), value=T)) 

將刪除對象a和b,但沒有別的。

rm(list=grep("^[ab]", ls(), value=T)) 

將刪除對象a,aa,b和bb,但將c和cc留在環境中。

1

可以用循環容易夠

test.a <- 4 
test.b <- 3 
test.c <- 2 
test.aa <- 2 
test.bb <- 6 
test.cc <- 9 

custom <- c("test.a", "test.b") 
for (x in custom) rm(list = ls(pattern = x)) 

NB我加入的測試來完成。到對象名稱的開頭,以避免在運行此代碼時與人員環境混淆。我們不會無意中刪除名爲a或b等人的實際對象。

相關問題