Short answer: I don't know.
My guess is this:
-forvalues- expects to see a number at that
position. (-while- on the other hand is
willing to do more work for you.)
This code works if there is no name conflict, i.e.
no variable unambiguously abbreviatable [?]
as -n-:
forval i = 1/`=n' {
...
}
and this works if there is a name conflict:
forval i = 1/`=scalar(n)' {
...
}
Note that these are not counterexamples
to your assertion that -forval- doesn't
work with scalars. In these examples,
-forval- never sees the scalar; it just
sees the numerical result of evaluating
it in place. The scalar is out of sight,
and so out of mind.
It is the same principle, I think,
with locals. Why does
local n = _N
forval i = 1/`n' {
...
}
work? Because an important thing that
Stata does when interpreting your
code is to replace all local and global
macros with their current contents _before_
passing the code to the command in question. So
`n' is _never_ seen as such by -forval-.
It just sees the numerical (in this
case) result of substituting its contents
in place.
Aside: You don't need a loop of any kind
for this example.
gen ind = index(var1, "r") > 0
gets you there in one.
Nick
[email protected]
Dimitriy V. Masterov
> I am curious why I cannot use a scalar in a forvalues loop.
> I was trying
> to write a loop that will create a variable ind that equals
> 1 if the var1
> contains the letter "r", 0 otherwise. I suspect it has
> something to do
> with the frontslash in the second example, but I have not
> found a way to
> get around it. Some sentences about the backslash in [U]
> 21.3.9 hint that
> this might be the problem, though I don't know for sure.
>
> The code below works fine to do what I want:
> **********************************************************
> local n=_N
> gen ind=0
> forvalues v=1/`n' {
> replace ind=index(var1[`v'],"r") in `v'
> }
> replace ind=1 if (ind>1 & ind !=.)
> ***********************************************************
>
>
> while this code does not work:
> ***********************************************
> scalar n=_N
> gen ind=0
> forvalues v=1/n {
> replace ind=index(var1[`v'],"r") in `v'
> }
> replace ind=1 if (ind>1 & ind !=.)
> ***********************************************
>
> And this code works fine, though it's a different kind of loop.
> ***********************************
> scalar n=_N
>
> local i=1
> while `i'<n {
> di "`i'"
> local i=`i'+1
> }
> ***********************************
>
*
* For searches and help try:
* http://www.stata.com/support/faqs/res/findit.html
* http://www.stata.com/support/statalist/faq
* http://www.ats.ucla.edu/stat/stata/