| |
[Date Prev][Date Next][Thread Prev][Thread Next][Date index][Thread index]
Re: st: Program within a Program
Kyle C Longest wrote, in part:
> I have a question about using a program within a program. I have
> created a program and have added a set of options to it. Everything is
> working fine, except one of my options contains another program I wrote
> within it, and I can not figure out how to get it to work properly.
> This particular option runs a bootstrap on the program within it.
> . . .
and Austin Nichols replied:
> Kyle--
> Do I understand that you are trying to define a -program- within the
> definition of another program in a -program- -end- block? The right
> way to program is to write a bunch of separate programs, save them to
> a file called something.ado, and to pass parameters from one program
> to another as appropriate using -args- or -syntax- or the like. See
> the [P] manual and have a look at a good example:
> . viewsource ivreg.ado
>
Kyle subsequently asked about passing local macro arguments from a main program
to a subprogram, and about wrapping them in an .ado vs. .do file. Austin then
provided a nice illustration with example program -testsub- , which calls
subprogram -sub-. And Nick elaborated on the locality of local macros in a
program.
If I understand Kyle's original program and question correctly, there may be one
additional consideration that will have an effect here, and that is Kyle's
intended use of the -bootstrap- command in the main program. To borrow from
Austin's example, if the programs -testsub- and -sub- are both defined in the
program file testsub.ado, the -sub- program can be called directly from the
-testsub- program, but it canNOT be called from -testsub- as a command argument
to the -bootstrap- command.
I have borrowed and modified Austin's example to fit what I perceive to be
Kyle's intended use of a local subprogram, i.e. as command argument to
-bootstrap-. The following should not work:
----------
*** beginning of testsub.ado *****
prog testsub
syntax varlist(numeric) [, mod2(varlist)]
bootstrap ngrp = r(N) : sub `varlist', mod2(`mod2')
end
prog sub, rclass
syntax varlist(numeric) [, mod2(varlist)]
tempvar g
qui egen `g' = group(`mod2')
qui tab `g'
ret scalar N = `=r(r)'
end
*** end of testsub.ado *******
sysuse auto
testsub mpg, mod2(rep78)
tab rep78
-----------
-bootstrap-, called from within a user defined program, will not recognize a
locally defined subprogram. I know this only because I attempted to write a
program to do just this recently, and was assured by Stata Technical support
that I could not (though I made an appeal for a future change to what I guess to
be a correctable limitation of -bootstrap-). The suggested way around this was
to define the called program (-sub-) as a separate program outside of the main
program (-testsub.ado- in this case).
Wrapping the two programs above in a .do file rather than an .ado file should,
on the other hand, work. -sub- will in this case be defined as separate program
unrelated to -testsub- rather than as a subprogram.
- Gary
*
* 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/