Thank you very much for your answer, it works now! Indeed, I only tried to use global macros since I couldn't find the correct syntax for using the mata variable 'i' in order to create a flexible file name. This kind of syntax when trying to combine string components and numeric components is - at least from my perspective - not very well described in the mata help.
What also confuses me is the fact that 'st_global("i",strofreal(i))' and 'stata("display $i")' actually work when you execute it manually in the command window (being in mata), but doesn't when it is part of a do-file...
Benjamin
-------- Original-Nachricht --------
> Datum: Mon, 28 Jul 2008 12:44:50 -0500
> Von: [email protected]
> An: [email protected]
> Betreff: Re: st: problems with global macros in mata
> Benjamin Klaus <[email protected]> writes,
>
> > I want to export the (changing) content of a matrix "x" from mata into
> > textfiles named "mi.txt", where "i" is a global macro. This should work
> in
> > the following way, but it seems that the value of the global macro is
> not
> > changed correctly at each stage of the loop...
> >
> >
> > mata
> > x = (76, 53, 48 \ 53, 88, 46 \ 48, 46, 63)
> > i=0
> > while (i<=5) {
> >
> > i = i + 1
> > st_global("i",strofreal(i))
> > stata("display($i)") // just to check the value
> > // (it doesn't work)
> > mm_outsheet("D:\m$i.txt", strofreal(x), "replace")
> > }
> > end
>
> First let me address the problem asked about, and then let me give a
> better
> way to proceed. Let's simplify the above to read
>
> mata
> i = 0
> while (i<=5) {
> i = i + 1
> st_global("i", strofreal(i))
> stata("display $i")
> }
>
> As Benjamin notes, it does not work: It displays nothing. What will work
> is
> changing
>
> stata("display $i")
>
> to
>
> stata("display $" + "i")
>
> What was happening is that, at compile time -- at the time the lines were
> entered into Mata, the contents of $i were substituted, so -stata("display
> $i")-
> became -stata("display ")-. The way I just coded it, $ and i do not
> appear
> adjacent yet, at execution time, the string "display $i" is assembled and
> then that is substituted when it goes to Stata.
>
> Now let's talk about mm_outsheet("D:\m$i.txt", strofreal(x), "replace").
> Obviously, there is the issue of $i, and so the line could be replaced
> with
>
> mm_outsheet("D:\m$"+"i.txt", strofreal(x), "replace")
>
> There still may be aproblem, however, depending on what mm_outsheet()
> does with its first argument. I am not familiar with the function
> -mm_outsheet()-, but understand, Mata at execution time does NOT
> substitute
> macros. "$i" just means "$i". The reason -stata(display $" + "i")-
> worked
> is that -display $i- was passed to Stata, and Stata expanded the macro $i.
>
> Mata expands macros at compile time, but not at execution time.
>
> One solution would be to use -st_macroexpand()-, the Mata function that
> expands macros:
>
> mm_outsheet(st_macroexpand("D:\m$"+"i.txt"), strofreal(x),
> "replace")
>
> That would work, but it is not the solution I am recommending.
>
> At this point, Benjamin must be thinking that working with macros in Mata
> is
> mighty inconvenient. He would be right. Macros, so natural in Stata, are
> not natural in Mata and in fact are not necessary. The better way to
> code the problem would be,
>
> i = 0
> while (i<=5) {
> i = i + 1
> mm_outsheet("D:\m"+strofreal(i)+".txt", strofreal(x),
> "replace")
> }
>
> We might also use -for- rather than while,
>
> for (i=1; i<=5; i++) {
> mm_outsheet("D:\m"+strofreal(i)+".txt", strofreal(x),
> "replace")
> }
>
> and perhaps the code would be more easily read if we coded,
>
> for (i=1; i<=5; i++) {
> fn = "D:\m" + strofreal(i) + ".txt"
> mm_outsheet(fn, strofreal(x), "replace")
> }
>
> or
>
> for (i=1; i<=5; i++) {
> fn = sprintf("D:\m%g.txt", i)
> mm_outsheet(fn, strofreal(x), "replace")
> }
>
> -- Bill
> [email protected]
> *
> * 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/
--
Psssst! Schon das coole Video vom GMX MultiMessenger gesehen?
Der Eine f�r Alle: http://www.gmx.net/de/go/messenger03
*
* 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/