楼主: hamsik11
2376 15

[原创博文] 关于sas编程的一点疑惑 [推广有奖]

11
zhaoping603 发表于 2011-5-10 18:22:05
10# soporaeternus

多谢你。我如果想输出里面的y1,y2,y3,怎么输出呢?我没弄明白。谢谢。

12
sas_user 发表于 2011-5-10 18:51:44
意思就是将X的值乘以2后赋给Y。这样三个x的值就分别乘以2以后赋给3个宏变量Y了。
输出Y的值可以有两种办法,一个是用symget将宏变量再赋给新的变量Y,还有就是在log里打印。谢谢。
data a;
        do i=1 to 3 by 1;
        x=ranuni(0);
        call symput('y'||left(i),x*2);
                y=symget('y'||left(i));
                output;
        end;
run;
%put &y1=  &y2=  &y3=;

13
456852 发表于 2011-5-10 22:57:23
sas_user 发表于 2011-5-6 23:23
比如说下面的宏变量y1,y2,y3是由随机数x产生出来的,就不能直接定义而要用call symput.
data a;
        do i=1 to 3 by 1;
        x=ranuni(0);
        call symput('y'||left(i),x*2);
        end;
run;
%put _user_;
谁说不能直接定义?
%macro er();
%do i=1 %to 3;
%let y&i=%sysfunc(rannor(12345));
%put &&y&i;
%end;
%mend;
%er();

14
sas_user 发表于 2011-5-10 23:16:12
学习了。谢谢。不好意思,没讲清楚。之所以用symput 是相对于data step而言。个人理解symput的本意是当我们需要先执行data step,得出值来以后再赋给宏变量的时候,symput就可以达到这个目的。而通常宏变量的赋值是先于data step 的。比如下面, 第一个程序中z就被解析成x*y, 而第而个程序中z就被解析成12.
data a;
x=3;
y=4;
%let z=x*y;
run;

data a;
x=3;
y=4;
call symput('z',x*y);
run;

15
456852 发表于 2011-5-10 23:49:21
sas_user 发表于 2011-5-10 23:16
学习了。谢谢。不好意思,没讲清楚。之所以用symput 是相对于data step而言。个人理解symput的本意是当我们需要先执行data step,得出值来以后再赋给宏变量的时候,symput就可以达到这个目的。而通常宏变量的赋值是先于data step 的。比如下面, 第一个程序中z就被解析成x*y, 而第而个程序中z就被解析成12.
data a;
x=3;
y=4;
%let z=x*y;
run;

data a;
x=3;
y=4;
call symput('z',x*y);
run;
第一个程序中z被解析为x*y是当然的,因为x和y之前定义的都是变量而不是宏变量,而且你定义z的时候没有引用。如果你把x,y转化成宏变量的话,再写%let z=%eval(&x * &y),z就被解析成12了。
至于谁先谁后我还真不知道,因为即使你把%let那句话拿出整个data步,z还是解析成x*y而不是其他。
期待高手来回答。

16
soporaeternus 发表于 2011-5-11 08:55:41
宏本来就是对SAS语句的操作......
宏肯定先于其他SAS语句解析的
Let them be hard, but never unjust

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-2 18:48