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

Re: st: RE: How to get a macro with content `something'

From   Alex Gamma <[email protected]>
To   statalist <[email protected]>
Subject   Re: st: RE: How to get a macro with content `something'
Date   Wed, 27 Jan 2010 00:09:23 +0100


thanks for this clear explanation. To answer your question at the end (why do I think I need this?):

The problem arose from my wish to put together a graph command that incorporates a single graph for every observation
in a dataset and then overlays them (see code below).

So I'm looping over all observations to

1) construct the bits of the graph command for each observation (here: (function y = exp.......) stored in the local macros g1 g2...g [_N]), and

2) to cumulate these bits into the final graph command (here: the local macro g) that overlays all the single graphs: - twoway (function y=exp.....)(function y=exp.....)(function y=exp.....)(function y=exp.....) ... - with a total of _N (function...) blocks

Here's the code:
(a, b, label are variables in the dataset)

local N=_N
forvalues i = 1(1)`N' {
	local t`i' = label[`i']
local g`i' = "(function y = exp(a[`i']*(x-b[`i']))/(1+ exp(a[`i']*(x- b[`i']))), range(-6 6) title(`t`i''))"
	local g = "`g'" + "`g`i''"

twoway "`g'"


The problem with this solution is that the graph command stored in macro g soon breaks the length limits for string variables. That's why I thought it would be nice to get macro g to store not the actual graph commands but just macro references to them: Macro g would then contain "`g1' `g2' `g3'... `g[_N]'" and - twoway "`g'" - would appropriatley expand to - twoway `g1' `g2' `g3'... `g [_N]' - which in turn would expand to - twoway (function[1])(function [2])...(function[_N]) -


Am 26.01.2010 um 18:22 Uhr schrieb Nick Cox:

Dereferencing occurs at all levels as soon as you write down one or more
pairs of ` ' to indicate a local macro. It's not a question of peeling
one layer off at a time. If that were so, working with nested macros
would be more tedious.

Thus although you inserted the text "`something'" inside local macro A,
as soon as you write


Stata looks inside, sees `something' and dereferences that in turn, so
what you get is no surprise.

If you don't want dereferencing, don't refer to a local macro (until you
need its contents, that is).

You can delay dereferencing just once by using a backslash, but that
doesn't wire in lifelong protection. It works just once, as said.

As I don't recognise your need as one I've felt in 15 or so years of
Stata programming, I am tempted to say you are not missing anything. But
let me ask directly:

Why do you think you need this?

[email protected]

Alex Gamma

although I feel I must be overlooking something big,
despite checking [P] and [U] and the Statalist archives,
I wasn't able to figure out how I can simply get a local
macro A with content `something', but without expanding
`something' (something is a macro, too, that contains,
let's say, foo1 [. loc something foo1]).

I couldn't get it to work using "\".
If I code
. loc A \`something'

I will get, as desired,
. mac list _A
_A:             `something'

But if I use A in code, e.g.
. loc s "`A'" + "foo2"

I get
.mac list _s
_s:              "foo1" + "foo2"
instead of
_s:              `something' + "foo2"

. di "`A'"
instead of

Is what I want impossible or even unnecessary?

*   For searches and help try:

*   For searches and help try:

© Copyright 1996–2024 StataCorp LLC   |   Terms of use   |   Privacy   |   Contact us   |   What's new   |   Site index