Estoy de acuerdo con la respuesta de Whuber, pero solo quería agregar que la porción "+2" del código, que intenta cambiar el índice para que coincida con el pico recientemente encontrado, en realidad 'se sobrepasa' y debería ser "+1". por ejemplo en el ejemplo en cuestión obtenemos:
> findPeaks(cc)
[1] 3 22 41 59 78 96
cuando resaltamos estos picos encontrados en un gráfico (rojo negrita):

vemos que están consistentemente a 1 punto del pico real.
consecuentemente
pks[x[pks - 1] - x[pks] > thresh]
debería ser pks[x[pks] - x[pks + 1] > thresh]opks[x[pks] - x[pks - 1] > thresh]
GRAN ACTUALIZACIÓN
siguiendo mi propia búsqueda para encontrar una función adecuada de búsqueda de picos escribí esto:
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 "pico" se define como un máximo local con mpuntos a cada lado de él más pequeños que él. por lo tanto, cuanto más grande es el parámetro m, más estricto es el procedimiento de financiamiento máximo. entonces:
find_peaks(cc, m = 1)
[1] 2 21 40 58 77 95
la función también se puede usar para encontrar mínimos locales de cualquier vector secuencial a xtravés de find_peaks(-x).
Nota: ahora he puesto la función en gitHub si alguien lo necesita: https://github.com/stas-g/findPeaks