On 1/29/2009 11:06 AM, Patrick Burns wrote:
Certainly not a complete description, but
'The R Inferno' talks about this on page 62.

Hmmm, I don't think I agree with that description. There's only one object named i in that example (which was

for (i in 1:6) {
  cat('\n i is', i, '\n\n')
  for (i in 1:4) cat('i is', i,'\n')
}

for the lazy). It gets set to 1, then to each of 1:4, then to 2, then to 1:4, etc. If you print the value after the inner loop, it will always be 4, you won't go back to the supposed other i. For example,

> for (i in 1:6) {
+   cat('\n i is', i, '\n\n')
+   for (i in 1:4) cat('i is', i,'\n')
+   cat('outer i is', i, '\n')
+ }

 i is 1

i is 1
i is 2
i is 3
i is 4
outer i is 4

 i is 2

i is 1
i is 2
i is 3
i is 4
outer i is 4

 i is 3

i is 1
i is 2
i is 3
i is 4
outer i is 4

Duncan Murdoch




Patrick Burns
patr...@burns-stat.com
+44 (0)20 8525 0696
http://www.burns-stat.com
(home of "The R Inferno" and "A Guide for the Unwilling S User")

dav...@rhotrading.com wrote:
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.




______________________________________________
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.

______________________________________________
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.

Reply via email to