простой проблема. Я хочу проверить, превышает ли разность двух точек (i, j) порог (diff). Если разница между точками превышает порог, индекс должен быть возвращен, а следующее расстояние измерено, но из нового дататота. Это простой фильтр отсечки, в котором все параметры данных с заданным предопределенным порогом фильтруются. Единственный трюк в том, что измерение выполняется всегда из «последней» точки (которая была «достаточно далеко от точки раньше»).R рекурсивная функция или петля в петле
я первый написал как два вложенных циклов, как:
x <- sample(1:100)
for(i in 1:(length(x)-1)){
for(j in (i+1):length(x)){
if(abs(x[i] - x[j]) >= cutoff) {
print(j)
i <- j # set the index to the current datapoint
break }
}}
Это решение является своего рода интуитивное. Но не работает должным образом. Я думаю, что назначение i и j недействительно. Первый цикл просто игнорирует, чтобы прыгать и проходить через все точки данных.
Ну, я не хотел тратить время на отладку и просто думал, что могу сделать то же самое с рекурсивной функцией. Так что я написал, как:
checkCutOff.f <- function(x,cutoff,i = 1) {
options(expressions=500000)
# Loops through the data and comperes the temporally fixed point 'i with the looping points 'j
for(j in (i+1):length(x)){
if(abs(x[i] - x[j]) >= cutoff){
break
}
}
# Recursive function to update the new 'i - stops at the end of the dataset
if(j<length(x)) return(c(j,checkCutOff.f(x,cutoff,j)))
else return(j)
}
x<-sample(1:100000)
checkCutOff.f(x,1)
Этот код работает. Но я получаю переполнение стека с большими наборами данных. Вот почему я спрашиваю себя, эффективен ли этот код. Для меня растут пределы и т.д. всегда намек на неэффективный код ...
Так что мой вопрос: Каких решений действительно эффективный? Спасибо!
Thx! Действительно хорошее решение. Я никогда не использовал RCPP. На самом деле у меня есть некоторые проблемы с его использованием на моем Win7, но на Linux все работает хорошо. Большое спасибо - теперь у меня также есть первый шаг в RCPP. :) – kn1g
Если вы хотите использовать Rcpp на Windows, вам нужно установить Rtools. – Roland
Я сделал все это. В конце проблема заключалась в том, что сам R был установлен в «Program Files», а Rcpp не смог обработать путь установки с пробелами. Переустановка R в «C: \ R \» решила проблему. Спасибо за отличное решение! :) – kn1g