SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1544|回复: 3
打印 上一主题 下一主题

请教关于call symput的使用原理

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2011-2-17 07:42:02 | 只看该作者

请教关于call symput的使用原理

在数据处理时遇到了个问题,首先是关于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?
请大虾帮忙指点迷津。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2011-2-17 11:59:15 | 只看该作者

Re: 请教关于call symput的使用原理

a=4应该都是得不到的,因为"a=&is;"是先于call symput执行的。
另一方面,do i=1 to 4,每次会对已经存在的宏变量 is 的值修改,最后 is 的值只能是4。

关于用call symput建立/修改宏变量的原理过程,小弟最近刚好写了一篇简单的博文,你可以参考参考,呵呵
<!-- m --><a class="postlink" href="http://saslist.com/hssnow/2011/02/14/sas-macro-symbol-table-2/">http://saslist.com/hssnow/2011/02/14/sa ... l-table-2/</a><!-- m -->

.
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2011-3-4 18:24:27 | 只看该作者

Re: 请教关于call symput的使用原理

你如果想引用的话,一般只能再来遍data步。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2011-5-11 14:18:09 | 只看该作者

Re: 请教关于call symput的使用原理

其实你那里是如何引用group几的问题,你可以加个array就可以了。
data sitesmiddle;
input type $ group1 group2 group3 group4;
cards;
rb 7 7 7 6
ub 2 3 2 2
s 4 4 5 7
;
run;

data _NULL_;
set sitesmiddle;
array group group1-group4;
do i=1 to 4;
if type='rb'  then call symput(&quot;rb&quot;||strip(i),group(i));
if type='ub' then call symput(&quot;ub&quot;||strip(i),group(i));
if type='s' then call symput(&quot;s&quot;||strip(i),group(i));
end;
run;
%macro try;
options nosymbolgen;
%do mn=1 %to 4;
%put rb&amp;mn=&amp;&amp;rb&amp;mn ub&amp;mn=&amp;&amp;ub&amp;mn s&amp;mn=&amp;&amp;s&amp;mn;
%end;
%mend try;
%try;
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2025-6-10 15:26 , Processed in 0.068638 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表