Notice: On April 23, 2014, Statalist moved from an email list to a forum, based at statalist.org.

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

From |
Amadou DIALLO <[email protected]> |

To |
[email protected] |

Subject |
Re: st: Unexpected end of file in mata. |

Date |
Tue, 28 Jan 2014 20:14:23 +0100 |

Dear Bill, Indeed this is really awesome! Many thanks for taking on your scarce time to answer these questions. I really learn a lot and will keep improving my mata knowledge. I wish you a nice day. 2014-01-27, William Gould, StataCorp LP <[email protected]>: > Amadou Diallo <[email protected]> has yet more questions on Mata, > and good ones. > >> I am a bit surprised to learn that mata/stata interprets "if (i=2) {" >> as "whether 2 is not equal to 0." (I'd have thought equal to 2!). > > Think like this: > > a = b = 2 > > assigns the value 2 to a and b. That happens because > > a = b = 2 is equivalent to typing a = (b=2) > > Thus, (b=2) returns 2, and that's how a is set equal to 2. > > Okay, we've established that the expression (b=2) returns 2. > So now consider > > if (b=2) { > ... > } > > The statement (b=2) is true because b=2 returns 2 and Mata interprets > 0 to mean false and all other values to mean true. > > >> I couldn't find a way to ask mata to check whether x was indeed a >> colvector... > > A colvector has one column. Ergo, > > if (cols(a)==1) { > /* a is a column vector */ > } > > Other useful functions in checking what a variable contains > include rows(), length(), eltype(), isreal(), iscomplex(), isstring(), > and ispointer(). > > >> More generally, when a mata program aborts (with a error code as it >> seems to me it is almost always the case), how to capture that error >> code, so that we use that _rc as in stata mode? > > When somethiung goes wrong, Mata aborts the execution and presents > an ugly traceback log, a process we summarizes by saying that the > subroutine aborts with error. Abort with error is useful for > debugging, but not so useful for professional code where you want to > present an error message and show the return code. > > The functions you want to learn about are errprintf(), error(), and > exit(). > > Let's consider the following code > > ... mysubroutine(...) > { > ... > stata("summarize + " user_specified_varname) > ... > } > > In this program, we want to run Stata's -summarize- command. Let's > imagine what happens when the user_specified_varname is not found. > The way stata() works, if the commnd fails, it aborts with error. > Here's alternative code that exits gracefully in the error case: > > ... mysubroutine(...) > { > real scalar rc > ... > if ((rc=_stata("summarize + " user_specified_varname)) { > exit(rc) > /*NOTRECHED*/ > } > ... > } > > _stata() is the function that does what stata() does, but rather than > aborting with error if the Stata command fails, returns the return > code from the Stata command in all cases. _stata() returns 0 when > the command executed without error. It returns nonzero when there > was a problem. > > exit() is the function that terminates execution (without traceback log) > and sets the return code to the specified argument. > > Oh yes, and notice that I used expression (rc=...) with the single equal > sign. I could have coded the expression ((rc=...)!=0). > > I didn't have to call Stata to get a return code. Here's another > example: > > ... myothersubroutine(...) > { > ... > if (cols(x)!=1) { > exit(error(503)) > } > ... > } > > error(503) presents the error message associated the return code 503, > and it returns 503. exit() exits cleanly -- stops execution -- with > the specified return code. Thus, the user will see > > . whatever ... > conformability error > r(503); > > Here's a version that's more customized: > > ... myothersubroutine(...) > { > ... > if (cols(x)!=1) { > (void) error(503) > errprintf("{p 4 4 2}\n") > errprintf("%d x %d found where column vector > expected.\n", > rows(x), cols(x)) > errprintf("{p_end}\n") > exit(503) > } > ... > } > > The user will see > > > . whatever ... > conformability error > 2 x 4 found where column vector expected. > r(503); > > -- Bill > [email protected] > * > * For searches and help try: > * http://www.stata.com/help.cgi?search > * http://www.stata.com/support/faqs/resources/statalist-faq/ > * http://www.ats.ucla.edu/stat/stata/ > -- Amadou B. DIALLO, PhD. Senior Economist, AfDB. [email protected] +21671101789 * * For searches and help try: * http://www.stata.com/help.cgi?search * http://www.stata.com/support/faqs/resources/statalist-faq/ * http://www.ats.ucla.edu/stat/stata/

**References**:**Re: st: Unexpected end of file in mata.***From:*"William Gould, StataCorp LP" <[email protected]>

- Prev by Date:
**st: predicting yhat of height for each individual at different ages** - Next by Date:
**Re: st: Two datasets: Look for similar observations in the second dataset** - Previous by thread:
**Re: st: Unexpected end of file in mata.** - Next by thread:
**st: Code problem with NLSUR quadratic AIDS, when considering zero observations** - Index(es):