*i think you knew the reason why your program did not work well;
*as far as I know, %do only works on integer (%eval());作者: shiyiming 时间: 2009-6-5 21:11 标题: Re: 求助编程中的问题 好的,谢谢,我的确知道是什么问题,也知道用eval就是不知道怎么用,
再次感谢作者: shiyiming 时间: 2009-6-5 21:33 标题: Re: 求助编程中的问题 能不能帮我看看为什么刚才的问题单独算是没有问题的,为什么我的加到我自己的程序中,就会有问题呢
%let delta=.10;
%macro cusum(k=.05,ucl=4.1089,w=50,outfile=asdsum,t=50);
data asdsum;
j=.;
c=.;
x=.;
run;
%do i=1 %to &t;
Data asd;
j=0;
c=0;
do while (c<&ucl);
j+1;
if(j>=&w) then x=rannor(0)+&delta;
else x=rannor(0);
c+x-&k;
c=max(c,0.00);
end;
run;
proc append base=asdsum data=asd;
run;
%end;
data asdmean(keep=mean sum delta);
set asdsum end=endobs;
if (j>=50) then do;
sum+1;
rl+j-50;
end;
if endobs;
mean=rl/sum;
delta=&delta;
run;
%mend cusum;
%cusum;
%macro deltacal;
data deltasum;
sum=.;
mean=.;
delta=.;
run;
%do delta=10 %to 400 %by 5;
%let delta=%sysevalf(&delta_/100);
%cusum;
proc append base=deltasum data=asdmean;
run;
%end;
%mend deltacal;
%deltacal;作者: shiyiming 时间: 2009-6-5 22:10 标题: Re: 求助编程中的问题 %macro deltacal;
data deltasum;
sum=.;
mean=.;
delta=.;
run;
%do delta=10 %to 400 %by 5[color=#FF4000:y24p7aub];*delta=10 should be delta_=10;[/color:y24p7aub]
%let delta=%sysevalf(&delta_/100);
%cusum;
proc append base=deltasum data=asdmean;
run;
%end;
%mend deltacal;
%deltacal;作者: shiyiming 时间: 2009-6-5 23:20 标题: Re: 求助编程中的问题 我想问一下为什么我都用delta不可以呢,好像没有要求有下划线呀作者: shiyiming 时间: 2009-6-5 23:49 标题: Re: 求助编程中的问题 There,
It is nothing to do with the naming convention. but look at the program
first you define macro variable 'delta' ,then you evaluate delta_; that is not consistent. I think, in case of any ambiguity, you could progarm like that
%local i;
%do i=10 %to 400 %by 5;
%let delta=%sysevalf(&i/100);
...作者: shiyiming 时间: 2009-6-6 07:03 标题: Re: 求助编程中的问题 还是不怎么明白,我还有一个问题要问,就像我在做上面的大循环的时候,一直会出现一个窗口,window is full and must be cleared, please select
这个问题怎么解决呢作者: shiyiming 时间: 2009-6-6 08:54 标题: Re: 求助编程中的问题 这么大的循环,看得我头发晕,错一点在所难免。要换了我,估计行行都错!作者: shiyiming 时间: 2009-6-6 09:12 标题: Re: 求助编程中的问题 我的程序现在没有什么问题了,但是唯一的问题就是它在运行的时候运行一段时间就会出来一个对话框说明window is full please clear, 我直接关闭就可以了,不过我想问问有没有什么方法可以使得这些窗口不出现作者: shiyiming 时间: 2009-6-6 09:38 标题: Re: 求助编程中的问题 很不好意思,我可以给你点建议,这样写程序肯定会产生很多日志。改进参考:
[code:v0irrvvu]源程序段:
data asdsum;
j=.;
c=.;
x=.;
run;
%do i=1 %to &t;
Data asd;
j=0;
c=0;
do while (c<&ucl);
j+1;
if(j>=&w) then x=rannor(0)+&delta;
else x=rannor(0);
c+x-&k;
c=max(c,0.00);
end;
run;
proc append base=asdsum data=asd;
run;
%end;
[/code:v0irrvvu]
等价程序如下:
[code:v0irrvvu]
Data asdsum(drop=mm);
if _n_=1 then do;j=.;c=.;x=.;output;end;
do mm=1 to &t;
j=0;
c=0;
do while (c<&ucl);
j+1;
if(j>=&w) then x=rannor(0)+&delta;
else x=rannor(0);
c+x-&k;
c=max(c,0.00);
end;
output;
end;
run;[/code:v0irrvvu]
我只提供一小段例子,你可以自己试着改改。
因为你这样的append程序效率低下,同时又产生很多日志。作者: shiyiming 时间: 2009-6-6 10:24 标题: Re: 求助编程中的问题 有意思。
我有些班门弄斧了。从此程序看,大量的输出应该在log window中产生。可以取消mprint等等的选择或者写入nonotes一类的options.
如果不考虑程序的可读性,可以把%cusum直接写入%deltacal之中。MACRO CALL MACRO不是很高效率吧。
data asdmean(keep=mean sum delta);
set asdsum end=endobs;
[color=#0000FF:2x4q35t4]if (j>=50) then do;[/color:2x4q35t4]
sum+1;
rl+j-50;
[color=#0000FF:2x4q35t4]end;[/color:2x4q35t4]
if endobs;...
应该等价于
data asdmean(keep=mean sum delta);
set asdsum[color=#0000FF:2x4q35t4](where=(j>=50)) [/color:2x4q35t4]end=endobs;
sum+1;
rl+j-50;
if endobs;...
但这可以避免读入无用的数据,对吗?