我对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
s $ 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 :(得分:4)
怎么回合
> lapply(s,sapply,classify,peaks)
$a
[1] 1 2 3
$b
[1] 1 2 3
$c
[1] 1 2 3
答案 1 :(得分: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)
答案 2 :(得分:1)
lapply(s, function(x) classify(x, peaks))
会将s
列表中的每个元素作为n
传递给函数classify。 lapply(s, classify, peaks)
将峰值作为n
进行分类。