2012-01-30 27 views
2

lapply函數的工作原理存在根本性問題。我想分類列表中每個向量的每個成員。更改列表中的每個向量

我的列表:

s <- list(
    a = c(1, 20, 300), 
    b = c(1.1, 20.1, 300.1), 
    c = c(1.2, 20.2, 300.3) 
) 

我的分類功能:

classify <- function(n, peaks){ 
    which(abs(peaks-n)==min(abs(peaks-n))) 
} 

我峯:

peaks <- c(1.27350, 20.32662, 300.02650) 

如果本身我classify US $ C,我得到的結果,我期望:

> sapply(s$c,classify,peaks) 
[1] 1 2 3 

但是當我嘗試所有的向量一次分類,我得到這個:

> lapply(s,classify,peaks) 
$a 
[1] 3 //should be 1,2,3 

$b 
[1] 3 //should be 1,2,3 

$c 
[1] 1 //should be 1,2,3 

爲什麼我收到,我這樣做的結果?我如何得到我想要的結果?

+0

裏奇有一些很好的評論。我仍然在努力理解爲什麼'1,2,3'是你期望的結果。 'classify'旨在接受'n'和'peaks'的矢量嗎? – joran 2012-01-30 16:24:06

+0

'n'應該只是一個數字。我原以爲'lapply(S,分類,峯值)'會爲我想,因爲單曲<-lapply(s_as_text,as.integer)' 「numericized」 s_as_text來的工作。 – dnagirl 2012-01-30 17:05:20

回答

2

首先,樣式點:使用which.min找到最小的位置。

classify <- function(n, peaks){ 
    which.min(abs(peaks-n)) 
} 

第二,把你的代碼打破了一下,看看發生了什麼。

abs(peaks - s$a) #3rd value is smallest 
abs(peaks - s$b) #3rd value is smallest 
abs(peaks - s$c) #1st value is smallest 

這些指數是什麼被從調用返回到lapply


基於您的評論,我想你的問題是,lapply行爲的載體,當你真的想調用只是一切都調用一次,因爲classify中的每個元素已經被矢量化。試試這個:

if(is.list(s)) lapply(s, classify, peaks = peaks) else classify(s, peaks) 
+0

感謝風格點。所以,對於第二點,問題是我的功能需要以不同的方式處理矢量。因此,在編寫處理列表的函數時,通常會對輸入進行什麼樣的理智檢查? – dnagirl 2012-01-30 17:43:29

+0

@dnagirl:我認爲你想要的完整性檢查只是'is.list(s)'。看到我更新的答案。 – 2012-01-31 09:54:02

4

如何回合

> lapply(s,sapply,classify,peaks) 
$a 
[1] 1 2 3 

$b 
[1] 1 2 3 

$c 
[1] 1 2 3 
1

lapply(s, function(x) classify(x, peaks))將列表s的每個元素傳遞爲n在功能分類。 lapply(s, classify, peaks)通過峯值n進行分類。