f*****u 发帖数: 129 | 1 想做这么一个简单的loop,但是总是出错,请大家指点一下问题在哪里,谢谢!
%macro test(min,max,jump);
%do x = &min %to &max %by &jump;
print x;
%end;
%mend;
%test(1,3,0.5);
ERROR: A character operand was found in the %EVAL function or %IF condition
where a numeric operand is required. The condition was: &jump
ERROR: The %BY value of the %DO X loop is invalid.
ERROR: The macro TEST will stop executing. | g********0 发帖数: 90 | 2 %macro test(min,max,jump);
data bb;
do x = &min to &max by &jump;
output;
end;
run;
%mend;
%test(1,3,0.5);
condition
【在 f*****u 的大作中提到】 : 想做这么一个简单的loop,但是总是出错,请大家指点一下问题在哪里,谢谢! : %macro test(min,max,jump); : %do x = &min %to &max %by &jump; : print x; : %end; : %mend; : %test(1,3,0.5); : ERROR: A character operand was found in the %EVAL function or %IF condition : where a numeric operand is required. The condition was: &jump : ERROR: The %BY value of the %DO X loop is invalid.
| f*****u 发帖数: 129 | 3 谢谢,其实我是想在每个loop用x的值运行几个proc,
请问那样的话,我的code需要怎么改呢?再次感谢!
【在 g********0 的大作中提到】 : %macro test(min,max,jump); : data bb; : do x = &min to &max by &jump; : output; : end; : run; : %mend; : %test(1,3,0.5); : : condition
| f*****a 发帖数: 693 | 4 %macro test(min,max,jump);
%do x = &min %to &max %by &jump;
%let y=%sysevalf(&x-0.5);
%put &x &y;
%end;
%mend;
%test(1,3,1);
好像是sas macro 里的参数按字符处理,然后用%eval()来估值,但是%eval()只能估整
数值,所以你的0.5作为参数不行。但是我想在&min, &max, &jump前用上这个%
sysevalf()函数用来估值应该可以,但不知道为什么不行。我只好改成上面的方法,就
是参数里都是整数,在macro里再计算所需的指。还请高人指点能否有直接用参数
的方法。 | A*******s 发帖数: 3942 | 5 sas macro里的loop是不能用非整数的,很麻烦
得用别的方法迂回一下才行
%let x=&min;
%do %while (%sysevalf(&x <= &max));
%let x=%sysevalf(&x+&jump);
%put &x;
%end;
【在 f*****a 的大作中提到】 : %macro test(min,max,jump); : %do x = &min %to &max %by &jump; : %let y=%sysevalf(&x-0.5); : %put &x &y; : %end; : %mend; : %test(1,3,1); : 好像是sas macro 里的参数按字符处理,然后用%eval()来估值,但是%eval()只能估整 : 数值,所以你的0.5作为参数不行。但是我想在&min, &max, &jump前用上这个% : sysevalf()函数用来估值应该可以,但不知道为什么不行。我只好改成上面的方法,就
| f*****a 发帖数: 693 | 6 第一次回复错了,应该改成:
%macro test(min,max,jump);
%do x = &min %to &max %by &jump;
%let y=%sysevalf(&x-0.5*(&i-1));
%put &x &y;
%end;
%mend;
%test(1,3,1);
【在 f*****a 的大作中提到】 : %macro test(min,max,jump); : %do x = &min %to &max %by &jump; : %let y=%sysevalf(&x-0.5); : %put &x &y; : %end; : %mend; : %test(1,3,1); : 好像是sas macro 里的参数按字符处理,然后用%eval()来估值,但是%eval()只能估整 : 数值,所以你的0.5作为参数不行。但是我想在&min, &max, &jump前用上这个% : sysevalf()函数用来估值应该可以,但不知道为什么不行。我只好改成上面的方法,就
| f*****a 发帖数: 693 | 7 这个%do %while的思路更好,谢谢。
【在 A*******s 的大作中提到】 : sas macro里的loop是不能用非整数的,很麻烦 : 得用别的方法迂回一下才行 : %let x=&min; : %do %while (%sysevalf(&x <= &max)); : %let x=%sysevalf(&x+&jump); : %put &x; : %end;
| f*****u 发帖数: 129 | 8 多谢!
【在 A*******s 的大作中提到】 : sas macro里的loop是不能用非整数的,很麻烦 : 得用别的方法迂回一下才行 : %let x=&min; : %do %while (%sysevalf(&x <= &max)); : %let x=%sysevalf(&x+&jump); : %put &x; : %end;
| f*****u 发帖数: 129 | 9 多谢!
【在 f*****a 的大作中提到】 : 第一次回复错了,应该改成: : %macro test(min,max,jump); : %do x = &min %to &max %by &jump; : %let y=%sysevalf(&x-0.5*(&i-1)); : %put &x &y; : %end; : %mend; : %test(1,3,1);
|
|