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

From |
"Martin Weiss" <martin.weiss1@gmx.de> |

To |
<statalist@hsphsun2.harvard.edu> |

Subject |
Re: st: can one program a function in Stata? |

Date |
Wed, 22 Apr 2009 18:57:44 +0200 |

<>

**** clear* set obs 10 gen x=_n gen myanswer=cond(x>3,(sqrt(x) + 5)^(2/3), (sqrt(x) + 9)^(2/3)) list, noobs **** HTH Martin _______________________

To: <statalist@hsphsun2.harvard.edu> Sent: Wednesday, April 22, 2009 6:45 PM Subject: Re: st: can one program a function in Stata?

At 12:21 PM 4/22/2009, Jacob wrote:I am about to order Kit Baum's Introduction to Stata Programming. But I'm curious whether his book will answer the following question.Stata has what I would call plain old functions, of which sqrt() is anexample:. di sqrt(3.1415926535) 1.7724539 . sysuse auto, clear (1978 Automobile Data) . gen sqrtTurn=sqrt(turn) But suppose I want to define a function that's not found under -help functions-. The following approach (with a hypothetical nonstandard function) seems clumsy: capture program drop myownfunction program define myownfunction, rclass if `1' > 3 { return scalar myanswer= (sqrt(`1') + 5)^(2/3) } else { return scalar myanswer= (sqrt(`1') + 9)^(2/3) } end myownfunction 3.1415926535 di r(myanswer) Besides the awkward business of having to first call the function, then refer to - r(myanswer) - , this program only works for a single number (a scalar in the mathematical not Stata sense). If I want to apply it to an entire column of numbers (a Stata numeric variable), I'd have to write a different function, then always remember whether to call the scalar or the vector (variable) version. On the other hand, we can use sqrt() directly for either purpose. Thus, is there a way to define -myownfunction()- so that one can call it just as one calls sqrt()? Does one do this with -mata-, or ...? Would Kit Baum's book talk about this?This gets asked fairly often. To my knowledge, there is no way to do whatyou asked for. (I don't know enough about mata to comment about that.)Stata doesn't let you do that, but you can have programs that deposit avalue somewhere -- a variable, a scalar, an r() value (as you showed inyour example), a global macro, a local macro (though there are issuesabout that, and it is discouraged). Despite this limitation, Stata usersmanage fairly well.A notable example is -egen-, which is really a front end for a large suiteof programs that deposit values into variables. -egen- is extensible; youcan add your own programs to it. We often refer to these programs as"functions", though they really aren't functions. They just appear in acontext and syntax that makes them look like functions. To see how towrite an egen "function" see...viewsource egen.ado plus, look at one of the Stata-given programs, such as max (_gmax): viesource _gmax.ado HTH --David * * 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/

* * 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/

**References**:**st: can one program a function in Stata?***From:*Jacob Wegelin <jacob.wegelin@gmail.com>

**Re: st: can one program a function in Stata?***From:*David Kantor <kantor.d@att.net>

- Prev by Date:
**Re: st: mim: xtmelogit & mim: xtmixed** - Next by Date:
**RE: st: Generating comparison tables** - Previous by thread:
**Re: st: can one program a function in Stata?** - Next by thread:
**st: RE: can one program a function in Stata?** - Index(es):

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