Statalist


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

RE: st: Re: read tempvars in user created programs


From   "Nick Cox" <n.j.cox@durham.ac.uk>
To   <statalist@hsphsun2.harvard.edu>
Subject   RE: st: Re: read tempvars in user created programs
Date   Wed, 19 Nov 2008 18:24:55 -0000

Globals are a simple way to do it. I wouldn't regard their use as quite
so reprehensible as Sergei implies, but they are certainly disapproved
in general. 

You could also pass the contents of a local to the caller program, in
this case an interactive session, using -clocal-, which is not
documented (meaning, not documented, not -undocumented-). 

The usual comment about -clocal- is that you are ready to use it when
you have come across it in program code, you have worked out what it
does, and you can explain how dangerous it is. Nevertheless a search of
the Statalist archives will throw up several examples. 

On the central point raised by Mario, I am not completely clear that he
is completely clear on the key problem. To add a little to other
comments: 

The name of a temporary variable is put in a local macro: you specify
the name using -tempvar- (or -tempname-) and Stata fills that in with a
new variable name. That will be something like __000012 -- usually you
never need to know it or see it, as you use the local macroname and
Stata always translates into its own internal name. But necessarily the
local macro will not be visible outside the program in which the
temporary variable is declared: that is the essence of being _local_. 

Hence the need for subterfuges to make the names evident outside. 

Nick
n.j.cox@durham.ac.uk 

Sergiy Radyakin

the variables will be there. You can check this by calling -describe-
within your subroutine. However you must somehow tell the subroutine,
which variables you keep in mind (and for the subroutine they will not
be temporary, they will exist after the subroutine completes because
they were created before the subroutine started). If you pass the name
of the handle of the temporary variable the subroutine will not be
able to dereference it. To correct the problem, you must dereference
in the calling routine (the one that created the tempvar, or more
correctly that obtained a handle, potentially you can create the
variable itself in the subroutine), see example below. Using globals
is feasible but very highly unrecommended and should be avoid at all
means possible.

version 9.2
clear
program drop _all

program define summ_temp_var /* this is subroutine */
   args myvar
   describe
   sum `myvar'
   display "I have no idea what [`z'] means, because I have no access
to local z from here,"
   display "but I can see globals from anywhere, so I know that global
z is [$z]"
   sum $z
end

program define test_summ_temp_var /* this will create a tempvar */
  tempvar z  /* z is not accessible from the subroutine */
  global z `z'
  generate `z'=uniform()
  display "Tempvar z refers to `z'"
  summ_temp_var `z'  /* pass the value of z, not the name z itself */
  sum `z' /* variable still exists, it was not destroyed when the
summ_temp_var has finished */
  describe
end

sysuse auto
test_summ_temp_var
describe


On Tue, Nov 18, 2008 at 9:31 PM, mario fiorini
<mariofiorini@hotmail.com> wrote:

> yes I know that. I am mainly trying to understand whether there is a
way to have a program that sees tempvars generated externally to the
program itself. The summarize command is there just as an example.

>> From: martin.weiss1@gmx.de
>>
>> -summarize- never sees the -tempvar- that you intend to use; instead
it sees
>> nothing. If -su- sees nothing, it -summarize-s everything by default,
>> including your -tempvar-...

"mario fiorini"

>>> I have written a program to produce some test statistics. However,
the
>>> program does not seem able to use the temporary variables
>>> that I've generated outside of it. For illustrative purposes
consider the
>>> following lines, where I define a program to summarize a tempvar (my
real
>>> problem is more complex and that's why I use a program).
>>>
>>> // ===================
>>>
>>> cap program drop progtempvar;
>>> program define progtempvar;
>>>    args progvars;
>>>    di "`progvars'";
>>>    su `TV`progvars'';
>>> end;
>>>
>>> sysuse auto;
>>> tempvar TVprice; ge `TVprice'= price;
>>> progtempvar price;
>>>
>>> // ======================
>>>
>>> The program would not recognize the temporary variable. Is there a
way to
>>> get around this without creating a non-temporary variable?
>>> (that is why  " reg price `TVprice' " work instead?) Thanks in
advance,
>>>

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



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