Wednesday, March 22, 2006

Re: st: Mata function stata() within program

Ulrich Kohler <> 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 <> 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 * * For searches and help try: * * *


Links to this post:

Create a Link

<< Home

This page is powered by Blogger. Isn't yours?