I apologize for posting a wrong opinion; I should of course have checked before posting.
Henrik's examples illustrate something I had never realized before, and it really surprised me! Where can I read the technical details of this scoping aspect of 'for' as it still presents some subtle puzzles for me. For example: > for (ii in 1:3) { print(ii); if(ii==1){ii <- 20}; print(ii); print(ii <- ii + 1); print(ii)} [1] 1 [1] 20 [1] 21 [1] 21 [1] 2 [1] 2 [1] 3 [1] 3 [1] 3 [1] 3 [1] 4 [1] 4 Why does R treat ii differently after the 'if' in the first and subsequent iterations? And if the loop variable does not exist before the 'for', why is it created in the parent(?) environment at all? (I.e, if ii did not exist before the for loop, it does and has value 5 after. Wouldn't strict scoping mean that ii exists only within the for loop?) I generally don't try to change the loop variable's value inside a loop, but coming from C or other languages, it seems natural to do so in certain circumstances. And the examples are certainly bad programming style. But I remain confused. I assume that 'while' loops have different scoping rules? Thanks, -- David -----Original Message----- From: henrik.bengts...@gmail.com [mailto:henrik.bengts...@gmail.com] On Behalf Of Henrik Bengtsson Sent: Wednesday, January 28, 2009 5:08 PM To: David Reiner <dav...@rhotrading.com> Cc: SnowManPaddington; r-help@r-project.org Subject: Re: [R] - Re: for/if loop On Wed, Jan 28, 2009 at 2:41 PM, <dav...@rhotrading.com> wrote: > Well, maybe you are just bad at typing then ;-) > > The lines rr==ii, pp==pp+1, etc. are not setting rr and pp but comparing > them. > Probably you want rr <- ii and pp <- pp+1, etc. > And the last line of your loop 'ii=ii+1' means that, > since the for statement is already incrementing ii, > you are incrementing it twice and skipping the even indices. Omit this > line probably. That is actually not the case (because of the scoping rules for for(), I think). Example: > for (ii in 1:5) { print(ii); ii <- ii + 1; } [1] 1 [1] 2 [1] 3 [1] 4 [1] 5 Another "counter intuitive" (though it isn't) example: for (ii in 1:3) { cat("Outer ii:",ii,"\n"); for (ii in ii:3) { cat(" Inner ii:",ii,"\n"); } } Outer ii: 1 Inner ii: 1 Inner ii: 2 Inner ii: 3 Outer ii: 2 Inner ii: 2 Inner ii: 3 Outer ii: 3 Inner ii: 3 My $.02 /Henrik > You are also forgetting(?) the operator precedence in > sum(lselb1[rr:ii-1]) and similar lines. > Note that this is equivalent to sum(lselb1[(rr-1):(ii-1)]); is that what > you meant? > Or did you want sum(lselb1[rr:(ii-1)])? > You are changing some variables but not asking R to print anything as > far as I can see. > To see the results, ask R to print hll. > > HTH, > -- David > > -----Original Message----- > From: r-help-boun...@r-project.org [mailto:r-help-boun...@r-project.org] > On Behalf Of SnowManPaddington > Sent: Wednesday, January 28, 2009 3:59 PM > To: r-help@r-project.org > Subject: - Re: [R] for/if loop > > > Hi ya, I've revised the code (and finally know what I m doing.. :-D) > > The good news is.. I dont get any error message, but the bad news is the > following optim generate no results. I still think there is something to > do > with my loop... can anyone advice? Thanks again!!! > > > > pp=1 > rr=1 > > for (ii in 1:n){ > if (!(panel[ii] == pp)){ > hll[pp,1] == sum(lselb1[rr:ii-1]) > hll[pp,2] == sum(lselb2[rr:ii-1]) > rr==ii > pp==pp+1 > } > > if (ii==n){ > hll[pp,1] == sum(lselb1[rr:ii]) > hll[pp,2] == sum(lselb2[rr:ii]) > rr==ii > pp==pp+1 > } > ii=ii+1 > } > > > > > > pp=1 > rr=1 > > for (ii in 1:n){ > if (!(panel[ii] == pp)){ > hll[pp,1] == sum(lselb1[rr:ii-1]) > hll[pp,2] == sum(lselb2[rr:ii-1]) > rr==ii > pp==pp+1 > } > > if (ii==n){ > hll[pp,1] == sum(lselb1[rr:ii]) > hll[pp,2] == sum(lselb2[rr:ii]) > rr==ii > pp==pp+1 > } > ii=ii+1 > } > > > > > > SnowManPaddington wrote: >> >> Hi, it's my first time to write a loop with R for my homework. This > loop >> is part of the function. I wanna assign values for hll according to > panel >> [ii,1]=pp. I didn't get any error message in this part. but then when > I >> further calculate another stuff with hll, the function can't return. I >> think it must be some problem in my loop. Probably something stupid or >> easy. But I tried to look for previous posts in forum and read R > language >> help. But none can help.. Thanks! >> >> >> >> for (ii in 1:100){ >> for (pp in 1:pp+1){ >> for (rr in 1:rr+1){ >> if (panel[ii,1]!=pp) >> { >> hll(pp,1)=ColSums(lselb1(rr:ii-1,1)) >> hll(pp,2)=ColSums(lselb2(rr:ii-1,1)) >> rr=ii >> pp=pp+1 >> } >> else >> { >> hll(pp,1)=ColSums(lselb1(rr:ii,1)) >> hll(pp,2)=ColSums(lselb2(rr:ii,1)) >> rr=ii >> pp=pp+1} >> } >> }}} >> >> >> in fact I have the corresponding Gauss code here. But I really don't > know >> how to write such loop in R. >> >> rr=1; >> ii=1; >> pp=1; >> do until ii==n+1; >> if pan[ii,1] ne pp; >> hll[pp,1]=sumc(lselb1[rr:ii-1,1]); >> hll[pp,2]=sumc(lselb2[rr:ii-1,1]); >> rr=ii; >> pp=pp+1; >> endif; >> if ii==n; >> hll[pp,1]=sumc(lselb1[rr:ii,1]); >> hll[pp,2]=sumc(lselb2[rr:ii,1]); >> rr=ii; >> pp=pp+1; >> endif; >> ii=ii+1; >> endo; >> >> > > -- > View this message in context: > http://www.nabble.com/for-if-loop-tp21701496p21715928.html > Sent from the R help mailing list archive at Nabble.com. > ______________________________________________ R-help@r-project.org mailing list 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.