SAS 扫描不喜欢第二个参数(do 循环计数器)



需要第二双眼睛:

%MACRO FIND_CLOSEST_LIMIT_OR_DEDUCTIBLE(limOrDedOption,limOrDedValue);
    %LET numOptions = %Sysfunc(Countw(&limOrDedOption.));
    limOrDedSetFlag = 'N';
    %DO curLimOrDed = 1 %TO &numOptions.;
        IF limOrDedSetFlag = 'N' AND &curLimOrDed = 1 AND &limOrDedValue. <= %Scan(&limOrDedOption.,&curLimOrDed.) THEN DO;
            &limOrDedValue. = %Scan(&limOrDedOption,1);
            limOrDedSetFlag = 'Y';
        END;
        IF limOrDedSetFlag = 'N' AND &curLimOrDed. >= 2 THEN DO;
            lowerLimOrDed = %Scan(&limOrDedOption,prevLimOrDed, &curLimOrDed. - 1);
            upperLimOrDed = %Scan(&limOrDedOption.,&curLimOrDed);
            IF &limOrDedValue. < %Scan(&limOrDedOption.,&curLimOrDed) THEN DO;
                IF (&limOrDedValue. - lowerLimOrDed)/ (upperLimOrDed - lowerLimOrDed) < 0.5 THEN 
                    &limOrDedValue. = lowerLimOrDed;
                ELSE &limOrDedValue. = upperLimOrDed;
                limOrDedSetFlag = 'Y';
            END;
        END;
    %END;
    IF MISSING(&limOrDedValue.) THEN &limOrDedValue. = 0;
/*  DROP lowerLimOrDed upperLimOrDed;*/
%MEND FIND_CLOSEST_LIMIT_OR_DEDUCTIBLE;

收到以下错误:

MPRINT(FIND_CLOSEST_LIMIT_OR_DEDUCTIBLE):   IF limOrDedSetFlag = 'N' AND 1 >= 2 THEN DO;
ERROR: A character operand was found in the %EVAL function or %IF condition where a numeric operand is required. The condition was: 
       prevLimOrDed 
ERROR: Argument 2 to macro function %SCAN is not a number.
NOTE 137-205: Line generated by the invoked macro "FIND_CLOSEST_LIMIT_OR_DEDUCTIBLE".
104         DO;    lowerLimOrDed = %Scan(&limOrDedOption,prevLimOrDed, &curLimOrDed. - 1);    upperLimOrDed =
                                                                                         _
                                                                                         22
104      ! %Scan(&limOrDedOption.,&curLimOrDed);    IF &limOrDedValue. < %Scan(&limOrDedOption.,&curLimOrDed) THEN DO;     IF
104      ! (&limOrDedValue. - lowerLimOrDed)/ (
ERROR 22-322: Syntax error, expecting one of the following: a name, a quoted string, a numeric constant, a datetime constant, 
              a missing value, INPUT, PUT.  

看起来SAS不喜欢&curLimOrDed-1。有什么帮助吗?

谢谢!

我想你需要附上&curLimOrDed - 1

转换为%EVAL()函数,以便按预期进行评估:%EVAL(&curLimOrDed - 1)

除此之外,错误消息实际上说明了问题:

The condition was: prevLimOrDed 

这是因为在你的声明中:

lowerLimOrDed = %Scan(&limOrDedOption,prevLimOrDed, &curLimOrDed. - 1);

prevLimOrDed不是用作宏变量,而是在宏函数内部使用。它是数据步变量吗?对于%SCAN函数,它只表示文本"prevLimOrDed",而函数需要一个数字参数。

Scan函数的第三个参数用于分隔符,该分隔符必须是字符值。您正在对第三个参数进行一些计算。

最新更新