Bookmark and Share

Notice: On April 23, 2014, Statalist moved from an email list to a forum, based at

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: st: Using arguments in a global macro

From   Nick Cox <>
To   "" <>
Subject   Re: st: Using arguments in a global macro
Date   Mon, 10 Feb 2014 12:22:00 +0000

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.


On 10 February 2014 09:35, Nick Cox <> 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
> may be of interest.
> Nick
> On 10 February 2014 05:10, David Kantor <> 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:

© Copyright 1996–2018 StataCorp LLC   |   Terms of use   |   Privacy   |   Contact us   |   Site index