Notice: On April 23, 2014, Statalist moved from an email list to a forum, based at statalist.org.
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
RE: st: Using arguments in a global macro
From
"Kate Ivanova" <[email protected]>
To
<[email protected]>
Subject
RE: st: Using arguments in a global macro
Date
Mon, 10 Feb 2014 15:56:13 -0500
Thank you, David and Nick. I now have a much better idea of the use of
macros. I really appreciate your help.
Kate
-----Original Message-----
From: [email protected]
[mailto:[email protected]] On Behalf Of Nick Cox
Sent: Monday, February 10, 2014 7:22 AM
To: [email protected]
Subject: Re: st: Using arguments in a global macro
Perhaps I should add that standard Stata style might frown on the use of
globals here at all.
Your code is clear enough here as the global is defined a few lines away
from the program, but in principle it could be defined anywhere in your
code. That's a nightmare to debug.
I'd go so far as to say that I would wonder about any use of globals in a
program other than those defined by Stata itself.
Nick
[email protected]
On 10 February 2014 09:35, Nick Cox <[email protected]> wrote:
> You could use delayed evaluation as David suggests, but I find to hard
> to think of any real advantages to that.
>
> Note also that your program defines -var3- regardless of input. Its
> input is mapped to local macro `var' but you don't ever use that
> local.
>
> The following is closer to what I take to be standard Stata style.
>
> global x "var1 var2'"
> program prog1
> args var
> gen `var' = 1
> reg depvar $x `var', noconstant end
> prog1 var3
>
> The whole idea here is that you can wait until you know the name of
> something before you use it. Otherwise put, you can't act until you
> know that name, so being patient until you do is fine.
>
> The discussion in Gabi Huiber's blog at
> http://enoriver.net/index.php/2011/02/10/delayed-macro-substitution/
> may be of interest.
>
> Nick
> [email protected]
>
>
> On 10 February 2014 05:10, David Kantor <[email protected]> wrote:
>
>> x was assigned its value before prog1 was defined, and certainly
>> before
>> prog1 was invoked. At the time that x was assigned its value, var was
empty.
>> So you got what you asked for -- not what you meant to ask for.
>>
>> If you move the assignment to x so it is inside prog1, after -args
>> var-, then it should work as expected.
>>
>> But presumably, you really want to have the assignment of x right
>> where you put it, but arranged so that it evaluates var at a later
>> point. You may be able to use delayed-evaluation. This works for
>> locals; I've never tried it with globals, but I don't see why it
>> wouldn't work. Leave the assignment of x where you have it. But put a "\"
before `var' -- thus:
>>
>>
>> global x "var1 var2 \`var'"
>>
>> That will probably work.
>
> At 08:17 PM 2/9/2014, Kate Ivanoval wrote:
>
>>> I am interested whether it is possible to include a command line
>>> argument in a global macro. So far, I have tried to do that but it
>>> does not seem to work. What I have looks approximately like this:
>>>
>>> global x "var1 var2 `var'"
>>> program prog1
>>> args var
>>> gen var3=1
>>> reg depvar $x, noconstant end
>>> prog1 var3
>>>
>>> My "var3" variable is actually not a constant but I just used the
>>> simplest example to illustrate my point. When I run this program, I
>>> get the regression results but "var3" is simply omitted.
>>>
>>> I would appreciate any help with this. If I need to clarify my
>>> question, please let me know.
*
* For searches and help try:
* http://www.stata.com/help.cgi?search
* http://www.stata.com/support/faqs/resources/statalist-faq/
* http://www.ats.ucla.edu/stat/stata/
*
* For searches and help try:
* http://www.stata.com/help.cgi?search
* http://www.stata.com/support/faqs/resources/statalist-faq/
* http://www.ats.ucla.edu/stat/stata/