Sono d'accordo con la risposta di Whuber, ma volevo solo aggiungere che la parte "+2" del codice, che tenta di spostare l'indice in modo che corrisponda al picco appena trovato, in realtà "supera" e dovrebbe essere "+1". ad esempio nell'esempio in corso otteniamo:
> findPeaks(cc)
[1] 3 22 41 59 78 96
quando evidenziamo questi picchi trovati su un grafico (rosso grassetto):

vediamo che sono costantemente a 1 punto di distanza dal picco effettivo.
consequenty
pks[x[pks - 1] - x[pks] > thresh]
dovrebbe essere pks[x[pks] - x[pks + 1] > thresh]opks[x[pks] - x[pks - 1] > thresh]
GRANDE AGGIORNAMENTO
seguendo la mia ricerca per trovare un'adeguata funzione di ricerca del picco ho scritto questo:
find_peaks <- function (x, m = 3){
shape <- diff(sign(diff(x, na.pad = FALSE)))
pks <- sapply(which(shape < 0), FUN = function(i){
z <- i - m + 1
z <- ifelse(z > 0, z, 1)
w <- i + m + 1
w <- ifelse(w < length(x), w, length(x))
if(all(x[c(z : i, (i + 2) : w)] <= x[i + 1])) return(i + 1) else return(numeric(0))
})
pks <- unlist(pks)
pks
}
un "picco" è definito come un massimo locale con mpunti su entrambi i lati più piccoli di esso. quindi, più grande è il parametro m, più rigorosa è la procedura di picco del finanziamento. così:
find_peaks(cc, m = 1)
[1] 2 21 40 58 77 95
la funzione può anche essere utilizzata per trovare i minimi locali di qualsiasi vettore sequenziale xtramite find_peaks(-x).
Nota: ora ho impostato la funzione su gitHub se qualcuno ne ha bisogno: https://github.com/stas-g/findPeaks