Guardar un resultado de un macro. Saving the output of a macro.

13 views
Skip to first unread message

Luz Adriana

unread,
Feb 4, 2011, 11:02:51 AM2/4/11
to Lasug
Estoy probando como llamar un macro anidado dentro de otro. Quiero
guardar el resultado del macro Gen (genera numeros aleatorios). Solo
quiero generar un numero aleatorio, y lo quiero guardar en una
variable A, la cual quiero usar dentro del macro Example.
Alguien me puede dar alguna idea? Mi codigo probablemente se puede
hacer mas simple, estoy probando maneras de hacerlo funcionar que no
son elegantes.
Gracias por la ayuda.



%macro gen(n, Start, End);
data generate;
do Subj=1 to &n;
x= int ((&End - &Start +1)*ranuni(0) +
&Start);
output;
end;
run;


proc print data=generate noobs;
*title "Randomly Generated data set with &n
observations";
*title2 "Values are integers from &Start to &end";
run;
%mend gen;


%gen(10, 2000,3000);


/*macro that calls the macro above*/


options symbolgen;


%macro example(bound);


data _null_;
%gen(1,0,&bound);


run;


/*what follows below is a failed attempt to store the
random number, using a dataset with only one observation*/
proc means data=generate;
var x;
output out=temporary (drop=_type_ _freq_)
mean=therandomnumber;
run;


proc print data=generate.therandomnumber;
run;


%let a=generate.therandomnumber;
%put &a;


%mend example;


%example(10);

Altons

unread,
Feb 4, 2011, 11:41:38 AM2/4/11
to Lasug
Hola Luz,

el problema q tienes con tu macro es que estas llamando a un Data Step
dentro de otro, es decir, estas llamando la macro gen que es un data
step dentro de un data _null_ y por eso no te resulta. No estoy seguro
cual es el fin de generar numeros aleatorios de esta manera ya no
entiendo bien tu proceso, Si nos puedes dar mas detalles a lo mejor
puede que exista una manera mas facil de hacerlo.

De todas formas aqui tienes tu codigo "up & running":

%macro genLasug(n=,start=,end=,varname=,seed=);
do subj=1 to &n;
&varname=int((&end-&start+1)*ranuni(&seed)+&start);
end;
drop subj;
%mend;

%macro example(bound);
%global random;
data _null_;
%genLasug(n=10,start=50,end=&bound,varname=aleatorio,seed=0);
call symput('random',aleatorio);
run;
%mend;
%example(100);

%put random=&random;

SASludos,

Alberto
Reply all
Reply to author
Forward
0 new messages