In some languages, this kind of expression would result in re-calculating the length of a collection every iteration. For some data structures, determining the length is a non-constant time operation. I don't know enough about R or the data structure you are using to assert that this is true here. I'm curious if the following would improve the performance:
sitesLength<-length(sites)
for (i in 1:sitesLength) {
...