SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 649|回复: 9
打印 上一主题 下一主题

把数组元素当宏参数?

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2011-3-22 00:14:18 | 只看该作者

把数组元素当宏参数?

data a;
array sel[12] (6,5,7,9,10,12,14,8,2,1,3,4);
%let cd=2|3|5|12|7|9|2|4|65|45|7|11|9|3|6;
%let fn1=%SCAN(&cd,6,|);/*6is sel(1) */
...
end;
不能用call execute,因为call execute的解析顺序靠后。
谢谢~~~
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2011-3-22 06:27:56 | 只看该作者

Re: 把数组元素当宏参数?

[code:leil510f]%let cd=2|3|5|12|7|9|2|4|65|45|7|11|9|3|6;
data _null_;
array sel[12] (6,5,7,9,10,12,14,8,2,1,3,4);          
do i =1 to dim(sel);
        fn =SCAN("&cd", sel[i],'|');
        call symputx(cats('fn', i), fn);
end;
run;[/code:leil510f]
CALL EXECUTE是什么呢?所以我估计我可能把你的问题理解错了。京剧
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2011-3-22 10:49:51 | 只看该作者

Re: 把数组元素当宏参数?

超K哥,你到底要完成什么任务?能不能再说详细点?
1.business objective
2.technical requirement
3.data source
4.desired output
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2011-3-22 11:15:44 | 只看该作者

Re: 把数组元素当宏参数?

谢谢!

其实没什么,还是之前的那个,我怕乱简化了。不是什么商业的,只不过有个问题在那里卡着难受。而且我想看看到底行不行,可以增加建模灵活度应该。
我还是明确下比较好。谢谢京剧,但是sel必须是array,大家一看下面的代码就明白了。call execute被秒杀了,symput我的水平搞不定,fcmp+runmacro还不确定,
array传导在runmacro方面估计是个问题,考虑用label,可是我印象中label支持字符,sel(1)这样的估计解析够呛。

%macro a;
data a;
array sel[12] (6,5,7,9,10,12,14,8,2,1,3,4);
/*array fn[12] fn1-fn12;*/
%let c=1;
%let cd=2|exp(&fn12)|5|12|(fn3*fn4)|exp(&fn2)|(fn5-fn6)|4|sum(fn7,fn8)|sum(fn9,fn10)|7|log(&fn11)|9|3|6;

%let fn1=%SCAN(&cd,6,|);
%let fn2=%SCAN(&cd,5,|);
%let fn3=%SCAN(&cd,7,|);
%let fn4=%SCAN(&cd,9,|);
%let fn5=%SCAN(&cd,10,|);
%let fn6=%SCAN(&cd,12,|);
%let fn7=%SCAN(&cd,14,|);
%let fn8=%SCAN(&cd,8,|);
%let fn9=%SCAN(&cd,2,|);
%let fn10=%SCAN(&cd,1,|);
%let fn11=%SCAN(&cd,3,|);
%let fn12=%SCAN(&cd,4,|);
fn12=&fn12.;
fn11=&fn11.;
fn10=&fn10.;
fn9=&fn9.;
fn8=&fn8.;
fn7=&fn7.;
fn6=&fn6.;
fn5=&fn5.;
fn4=&fn4.;
fn3=&fn3.;
fn2=&fn2.;
fn1=&fn1.;
run;
%mend;
%a;

上面的利用了sas解析的漏洞,可以实现解析,别看报错。
但是那个array sel得靠它标号~~call execute平时可以用,但是这样里面它最后解析,就是个问题。
要是有把sel变成字符串宏变量也行(我知道宏变量其实就是字符串)。
另外注意一个data步,就是log显示为一个data+run的,fcmp+runmacro,runmacro多少data步都行。直接宏内嵌的话应该够呛~ <!-- s:lol: --><img src="{SMILIES_PATH}/icon_lol.gif" alt=":lol:" title="Laughing" /><!-- s:lol: -->
好像涉及到了data步和macro以及各个函数的解析顺序问题,这种东西对我来说,有点儿难~各位大侠,就帮帮小弟吧~
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2011-3-22 11:47:21 | 只看该作者

Re: 把数组元素当宏参数?

%macro a;
data a;
array sel[12] (6,5,7,9,10,12,14,8,2,1,3,4);
/*array fn[12] fn1-fn12;*/
%let c=1;
%let cd=2|exp(&amp;fn12)|5|12|(fn3*fn4)|log(&amp;fn2)|(fn5-fn6)|4|sum(fn7,fn8)|sum(fn9,fn10)|7|log(&amp;fn11)|9|3|6;
%let fn1=%SCAN(&amp;cd,6,|);
%let fn2=%SCAN(&amp;cd,5,|);
%let fn3=%SCAN(&amp;cd,7,|);
%let fn4=%SCAN(&amp;cd,9,|);
%let fn5=%SCAN(&amp;cd,10,|);
%let fn6=%SCAN(&amp;cd,12,|);
%let fn7=%SCAN(&amp;cd,14,|);
%let fn8=%SCAN(&amp;cd,8,|);
%let fn9=%SCAN(&amp;cd,2,|);
%let fn10=%SCAN(&amp;cd,1,|);
%let fn11=%SCAN(&amp;cd,3,|);
%let fn12=%SCAN(&amp;cd,4,|);
fn12=&amp;fn12.;
fn11=&amp;fn11.;
fn10=&amp;fn10.;
fn9=&amp;fn9.;
fn8=&amp;fn8.;
fn7=&amp;fn7.;
fn6=&amp;fn6.;
fn5=&amp;fn5.;
fn4=&amp;fn4.;
fn3=&amp;fn3.;
fn2=&amp;fn2.;
fn1=&amp;fn1.;
run;
%mend;
%a;

用这个fn1,exp的话数太大了
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2011-3-22 15:22:32 | 只看该作者

Re: 把数组元素当宏参数?

不清楚最终的需求。但猜测,你所需要的其实是用两个DATA 步来完成问题,而不是一个DATA步,这样就没有什么技术难度了。不用转技术的牛角尖了。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2011-3-22 15:26:01 | 只看该作者

Re: 把数组元素当宏参数?

是啊,俩就简单多了。可是这个是在fcmp里面,等同于单data步~~

所以我在想是不是用fcmp里的run_macro,这样数组就直接作为run_macro的参数,之后的话就是宏变量了,之后再在宏中解决战斗。
尽管run_macro在效率上有牺牲。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2011-3-23 22:04:29 | 只看该作者

Re: 把数组元素当宏参数?

突然发现本帖通篇都是4位版主间的强强对话,令人好生羡慕。本帖含金量极高啊。 <!-- s:shock: --><img src="{SMILIES_PATH}/icon_eek.gif" alt=":shock:" title="Shocked" /><!-- s:shock: -->
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
9#
 楼主| 发表于 2011-3-23 22:11:13 | 只看该作者

Re: 把数组元素当宏参数?

[quote=&quot;shiyiming&quot;:32ji9eht]突然发现本帖通篇都是4位版主间的强强对话,令人好生羡慕。本帖含金量极高啊。 <!-- s:shock: --><img src="{SMILIES_PATH}/icon_eek.gif" alt=":shock:" title="Shocked" /><!-- s:shock: -->[/quote:32ji9eht]
哈哈,施主也来了,锦上添花啊! <!-- s:lol: --><img src="{SMILIES_PATH}/icon_lol.gif" alt=":lol:" title="Laughing" /><!-- s:lol: -->
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
10#
 楼主| 发表于 2011-3-23 22:17:29 | 只看该作者

Re: 把数组元素当宏参数?

俺只是来打酱油的 <!-- s:oops: --><img src="{SMILIES_PATH}/icon_redface.gif" alt=":oops:" title="Embarassed" /><!-- s:oops: -->
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-11 11:57 , Processed in 0.089783 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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