Statalist


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

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


From   "Sergiy Radyakin" <serjradyakin@gmail.com>
To   statalist@hsphsun2.harvard.edu
Subject   Re: st: Re: read tempvars in user created programs
Date   Tue, 18 Nov 2008 22:12:23 -0500

Yes Mario,

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.

Hope this helps.

Best regards,
   Sergiy Radyakin

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:
> Hi Martin,
> 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.
>
> Mario
>
>> From: martin.weiss1@gmx.de
>> To: statalist@hsphsun2.harvard.edu
>> Subject: st: Re: read tempvars in user created programs
>> Date: Wed, 19 Nov 2008 00:59:54 +0100
>>
>> Well,
>>
>> -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-...
>>
>> HTH
>> Martin
>> _______________________
>> ----- Original Message -----
>> From: "mario fiorini"
>> To:
>> Sent: Wednesday, November 19, 2008 12:44 AM
>> Subject: st: read tempvars in user created programs
>>
>>
>>> Dear all,
>>> 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,
>>>
>>> Mario
*
*   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