|
[Date Prev][Date Next][Thread Prev][Thread Next][Date index][Thread index]
Re: st: Programming Problem: How to prevent macro substitution
From |
Christoph Birkel <[email protected]> |
To |
[email protected] |
Subject |
Re: st: Programming Problem: How to prevent macro substitution |
Date |
Wed, 16 Jul 2008 19:13:57 +0200 |
Eva, Nick,
thank you for your advice! I will try to transfer the generation of the
temporary variables into the loop which generates the macro, and follow
the suggestion of Nick, which seems to work well. Again: Many thanks!
Best,
Christoph
Eva Poen schrieb:
Nick, thank you.
I was looking for a solution that can be done independently of the
creation of the temporary variables, since this is how Christoph
started the thread. What I didn't realise is that my solution will
contain the interior double quotes, which a simple -display- will not
reveal:
. local test "hello " "hello"
. di "`test'"
hello hello
. di `"`test'"'
hello " "hello
It is therefore clearly not suitable, and plainly wrong. Thanks for
pointing it out to me. Austin gave a perfect, working solution.
I also agree that escaping macro substitution is often not the way
forward. At least I have managed to avoid it completely in my work.
Eva
2008/7/16 Nick Cox <[email protected]>:
I see. Well, there will be an almost equally simple way of doing that,
or an equivalent, and one which certainly won't entail escaping macro
substitution.
For example, suppose you are in a loop
Within some loop {
...
tempvar foo
local xlist `xlist' i.land|`foo'
...
}
Otherwise put, I don't think there is ever a problem for which lines
like
local ldep`u' "ldep`u'"
are part of the solution.
(We had a similar thread a while back in which someone asserted that it
was sometimes necessary to delay substitution, and I kept disputing
that. It's a myth that seems to grow out of trying to translate other
programming styles to Stata macro programming.)
Nick
[email protected]
Eva Poen
Thanks, Nick.
However, your suggestion does not produce the desired result:
. di "`xlist'"
i.land|ldep0 i.land|ldep1 i.land|ldep2
While Christoph was after:
. di "`xlist'"
i.land|`ldep0' i.land|`ldep1' i.land|`ldep2'
Unless I am missing something here.
Eva
2008/7/16 Nick Cox <[email protected]>:
I agree. In fact, I'd go one step further:
foreach u of numlist 0/2{
local xlist `xlist' i.land|ldep`u'
}
Sometimes the quotes just make things more complicated.
Eva Poen
take it in steps and it works:
foreach u of numlist 0/2{
local xlist "`xlist' " "i.land|" "`" "ldep`u'" "'"
}
-di "`xlist'"- returns
i.land|`ldep0' i.land|`ldep1' i.land|`ldep2'
on my machine.
2008/7/16 Christoph Birkel <[email protected]>:
I want to program a loop which produces a macro `xlist' containing a
list of
dummy variable interaction expansion expressions with temporary
variable
names `ldep0' , `ldep1' etc. as a string . For this purpose I wrote:
foreach u of numlist 0/`y2'{
local ldep`u' "ldep`u'"
local xlist "`xlist' i.land|``ldep`u'''"
}
The resulting macro should contain an expression like "
i.land|`ldep0'
i.land|`ldep1' i.land|`ldep2' " (when `y2' contains 2) which
can be
used as argument in -xi: reg-, as in: xi: reg yvar i.land `xlist' .
(The
temporary variables `ldep0' and so on, corresponding to the macros
are
generated later in a separate loop.)
What actually happens, is that, due to the single quotation marks,
the
macros containing the names of the temporary variables are subsituted
by
their content (which should not happen), so the content of the
resulting
macro is " i.land|ldep0 i.land|ldep1 i.land|ldep2 ", which cannot
be
used
to refer to temporary variables. For the same reason, it is not
possible to
define a local macro with a string as content which starts and ends
with
quotation marks. I found no way to avoid the unintended macro
substitution
using "\" or compound quotes. Any recommendation is highly
appreciated.
*
* For searches and help try:
* http://www.stata.com/help.cgi?search
* http://www.stata.com/support/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/statalist/faq
* http://www.ats.ucla.edu/stat/stata/
--
Christoph Birkel, M.A.
Wissenschaftlicher Mitarbeiter
-Studienfachberater BA-Studieng�nge Soziologie-
Martin-Luther-Universit�t Halle-Wittenberg
Institut f�r Soziologie
D-06099 Halle (Saale)
GERMANY
Tel.: ++ 49 3 45 / 55 24 22 5
Fax.: ++ 49 3 45 / 55 27 14 9
http://www.soziologie.uni-halle.de/birkel/
*
* For searches and help try:
* http://www.stata.com/help.cgi?search
* http://www.stata.com/support/statalist/faq
* http://www.ats.ucla.edu/stat/stata/