Statalist The Stata Listserver


[Date Prev][Date Next][Thread Prev][Thread Next][Date index][Thread index]

Re: st: Mata function stata() within program


From   wgould@stata.com (William Gould, Stata)
To   statalist@hsphsun2.harvard.edu
Subject   Re: st: Mata function stata() within program
Date   Wed, 22 Mar 2006 08:53:48 -0600

Ulrich Kohler <kohler@wz-berlin.de> wrote, 

> I have a Mata function which looks as follows:
> 
> -------------------------------------lsq.mata--
> (...)
> // Mata Function to extract the substitution costs from subcost-matrix
> void showhash(real rowvector R)
> {
>        string scalar key1
>        st_local("key1",key1)
>        key1 = strofreal(R[1,2])
>        st_local("key1",key1)
>        stata("local hash1 = mod(`key1',197)")
> }
>
> (...)
>------------------------------------------------

and Uli notes that when he runs it, he gets an error, 

> : R = 2,3,5,4
> : showhash(R)
> invalid syntax
>                  stata():  3598  Stata returned error
>               showhash():     -  function returned error
>                  <istmt>:     -  function returned error
> r(3598);

Alan Riley <ariley@stata.com> has already given a solution, and suggested
the line 

         stata("local hash1 = mod(`key1',197)")

be changed to read 

         stata("local hash1 = mod(\`key1',197)")

Alan's right, but his solution is too tricky for me.  Moreover, his 
solution shows he is still thinking an ado mode rather than Mata mode.

My suggested solution is 

         stata("local hash1 = mod("  +  key1  +  ", 197)")

and, with my solution, Uli's code can be simplified to read, 


        void showhash(real rowvector R)
        {
               string scalar key1

               key1 = strofreal(R[1,2])
               stata("local hash1 = mod("  +  key1  +  ", 197)")
        }

or even 

        void showhash(real rowvector R)
        {
               stata("local hash1 = mod("  +  strofreal(R[1,2])  +  ", 197)")
        }

Let me expound on the ado versus the Mata way of thinking.

Uli wanted to run the Stata command 

        local hash1 = mod(_______, 197)

where he substituted the value from Mata matrix R[1,2] for ______.
Why Uli wanted to do this, we don't know, nor care.

The ado way of thinking says we substitute a macro for _____, and arrange 
for the macro to contain R[1,2], so when the macro is substituted by 
Stata, we obtrain the desired result.  Good way of thinking, when you 
are writing an ado-file.

The Mata way of thinking is more direct:  we need to construct a string 

        "local hash1 = mod(_______, 197)"

where where R[1,2] is substitued for _____, and we can just use the standard
operators to do that,

        "local hash1 = mod("  +  strofreal(R[1,2])  +  ", 197)"

Here's a good rule:  It's perfectly okay to obtain input from macros, or
post output to macros.  That is one way Mata can communicate with ado-files.
If you have to use macros to obtain your result, however, you are thinking
ado, not Mata.  There's a simpler, more direct way.

-- Bill
wgould@stata.com
*
*   For searches and help try:
*   http://www.stata.com/support/faqs/res/findit.html
*   http://www.stata.com/support/statalist/faq
*   http://www.ats.ucla.edu/stat/stata/



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