Hi mnw, It looks to me as though you are testing the entire "holder" list each time you go through the function. First, I'm not sure that a simple "==" is the test you want. "movement" seems to be more than a single value and so you might want to write a function that tests whether all of the components of two "movement" objects are equal e.g.:
move_change<-function(currentx,previousx) { if(currentx$speed == previousx$speed) { if(currentx$heading == previousx$heading) return(0) } return(1) } Second, you probably don't want to test the entire list each time you loop through the function. Just use: if(i > 1) changes<-move_change(movement,holder) holder<-movement Jim On Sat, Oct 10, 2015 at 2:08 AM, mnw <ma...@aber.ac.uk> wrote: > Hi. I have some code which loops through raw GPS data. This initial loop > calculates distance, angle, speed etc between successive coordinates as > well > as type of movement e.g.left, right, forward. I want to construct a second > loop that goes through the movements and records 'Changes' as either '0' or > '1' depending on whether the movement changed or not. I have put the whole > code in for reference but the additional loop begins at the object > 'holder.' > I want to store movements in holder and then loop through holder to > determine 'changes.' At the moment it gives me 'Error in holder[[t - 1]] : > attempt to select less than one element.' The moment i make holder [[t]] it > works but just gives a list of '0's. I have tried many different things and > just cannot get it to work, so any help would be very much appreciated. > Again, sorry for the long post. > > > > > lst <- list() # temporary list to store the results > for (i in seq(1, nrow(R) - 1)){ # loop through each row of the 'R' matrix > lat1 <- deg2rad(R[i, 4]) > long1 <- deg2rad(R[i, 5]) > lat2 <- deg2rad(R[i + 1, 4]) > long2 <- deg2rad(R[i + 1, 5]) > gcd_vif <- gcd.vif(lat1, long1, lat2, long2) > > # calc estimated speed by mean of speeds between two GPS records > estSpeed <- (R[i, 6] + R[i+1, 6])/2 > > # calculate acceleration (velocity) > accel <- (R[i+1, 6] - R[i, 6]) / GPSSample > > # calculate absolute heading > heading <- absoluteHeading(lat1, long1, lat2, long2) > > # calculate bearing relative to previous GPS record > relAngle <- 0 > # if the number of GPS records is less than 3 then no change in track > if (i < 1) relAngle = heading > # otherwise consider the previous heading in order to calculate the new > track > else if (i > 0) { > relAngle = (previousHeading - heading) > > } > > > # determine whether movement is occurring and if so what type > # if there are insufficient history items then just record movement types > discretely > if (i < historyLength) movement <- movementType(relAngle, > angleThreshold) > > else if (i > historyLength-1) { > # Array to store speeds > speedHistory <- array(historyLength) > n = historyLength-1 > # get the speeds from the previous n (hisoryLength) "Movements" > for (j in seq(1, length(historyLength))){ > speedHistory [n] = R[i-j, 6] > n-1 > } > > if (!bayesFilter(speedHistory, minSpeed, GPS_accy)) movement <- > "non-moving" > else if(bayesFilter(speedHistory, minSpeed, GPS_accy)) movement <- > movementType(relAngle, angleThreshold) > > > } > > > holder <- list(movement) > holder [[i]] <- (movement) > > > for (t in length(holder)){ > if (holder[[t]] == holder[[t-1]]) > changes <- 0 > else changes <- 1 > > } > > > > # update previous heading information > previousHeading = heading > > > > > > > # Store the input data and the results > lst[[i]] <- c( > latitude_position_1 = lat1, > longtude_position_1 = long1, > latitude_position_2 = lat2, > longtude_position_2 = long2, > Distance = gcd_vif, > Speed = estSpeed, > Acceleration = accel, > Absolute_Heading = heading, > Relative_Heading = relAngle, > Movement = movement, > Changes = changes > > ) > > } > Results <- as.data.frame(do.call(rbind, lst)) # store the input data and > the > results in a data frame > Results > > > > -- > View this message in context: > http://r.789695.n4.nabble.com/for-loop-not-working-tp4713392.html > Sent from the R help mailing list archive at Nabble.com. > > ______________________________________________ > R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide > http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. > [[alternative HTML version deleted]] ______________________________________________ R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.