楼主: justins123
15191 4

[原创博文] 请教关于call symput的使用原理 [推广有奖]

  • 0关注
  • 0粉丝

高中生

7%

还不是VIP/贵宾

-

威望
0
论坛币
-1 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
86 点
帖子
8
精华
0
在线时间
22 小时
注册时间
2011-1-30
最后登录
2011-12-9

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
在数据处理时遇到了个问题,首先是关于call symput的执行原理,下面是我对其执行的测试
data _NULL;      
  do i=1 to 4;
     call symput("is",put(i,2.)) ;
  a=&is;
  put a=;
  end;
  run;
结果是:
a=4
a=4
a=4
a=4
请问为什么不是a=1, 2, 3, 4? 而只是4?
由于没有搞清以上call symput原理,我的程序无法运行,以下是我想处理的程序:
dataset sitesmiddle为:
type   group1 group2 group 3 group4
rb      7           7          7          6
ub     2           3          2          2
s       4           4          5          7   
我希望将 rb ub s所对应的group1--group4数据分别赋给宏变量,如rb对应group1值赋给宏变量rb1, group2赋给rb2....,ub对应group1赋给ub1...以此类推。
所得宏变量将用于以后的计算;以下是程序:
            data  _NULL_;
                          set sitesmiddle;
     do i=1 to 4;
                      call symput("is",put(i,1.));
     if type='rb' then  call symput("rb"||left(put(i,1.)),group&is);
                                    if type='ub' then  call symput("ub"||left(put(i,1.)),group&is);
                                    if type='s' then  call symput("s"||left(put(i,1.)),group&is);
                      end;
                     run;
%macro try;
%do mn=1 %to 4;
%put rb=&&rb&mn ub=&&ub&mn s=&&s&mn;
%end;
%mend try;
%try;
请问问题到底出在哪里?
我尝试将do loop放到data _NULL_以外用作%do loop后取消了call symput("is",put(i,1.));一句后是可以得到我想要的结果的,见下:
%macro try;
         %do mn=1 %to 4;
                data _NULL_;
                            set sitesmiddle;
   
     if type='rb' then  call symput("rb&mn",put(group&mn,2.));
                                   if type='ub' then  call symput("ub&mn",put(group&mn,2.));
                    if type='s' then  call symput("s&mn",put(group&mn,2.));
        
         
   run;
%put rb=&&rb&mn ub=&&ub&mn s=&&s&mn;
%end;
%mend try;
%try;
是不是说明call symput语句适用于%do loop而不适用于dataset内的do loop?
请大虾帮忙指点迷津。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:symput call put dataset Middle 程序

沙发
pinseng 发表于 2011-2-17 09:03:21 |只看作者 |坛友微信交流群
77   data _null_;
78       do i = 1 to 4;
79           call symput('is', 'i');
80           a = &is;
81           put a = ;
82       end;
83   run;

a=1
a=2
a=3
a=4

使用道具

藤椅
pobel 在职认证  发表于 2011-2-17 10:27:32 |只看作者 |坛友微信交流群
data _null_;
       do i = 1 to 4;
           call symput('is', i);
           a = symget('is');
           put a = ;
       end;
run;
和谐拯救危机

使用道具

板凳
Actree 发表于 2011-2-17 12:14:00 |只看作者 |坛友微信交流群
是不是问题关键就在于double和single quotation mark?

使用道具

报纸
hssnow 发表于 2011-2-17 13:10:15 |只看作者 |坛友微信交流群
2楼的程序是怎么运行出来的?不太可能吧,is 就无法被resolve出来

@Actree 和那个应该没啥关系,是一些关于宏编译执行过程,symput 和 symget 的用法为题,3楼正解
My Blog: http:/hssnow.name/
宁静致远

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-28 17:47