输入值如果宏变量存在,则还有其他一些值

时间:2017-02-02 13:50:17

标签: dynamic sas

需要在datastep之外执行宏变量的估值,并根据变量的存在,执行插入:

data my_dataSet; 
set ...
....
if %SYMEXIST(Variable_from_prior_code) = 1 then do;

    dataset_variable = &Variable_from_prior_code.;

    end;
else do;

    dataset_variable = &Some_default_value_from_prior_code;

end;

但是,当尝试将其作为“表观符号引用& Variable_from_prior_code”运行时,编译器会失败。尚未解决。 IE浏览器。即使条件不满足,编译器也会检查if语句的内容。

我提出了愚蠢的解决方法:从相反的方向接近这个,但感觉比獾包更愚蠢:

if %SYMEXIST(Variable_from_prior_code) = 0 then do; 

    dataset_variable = &Some_default_value_from_prior_code

    %let Variable_from_prior_code=0; /*Dummy value*/

    end;
else do;

    dataset_variable = &Variable_from_prior_code.;

end;

任何限制编译器评估内容的方法,它不应该因条件而导致? 或者,更优雅的解决方法,不需要创建变量?

1 个答案:

答案 0 :(得分:1)

我会说,除非必要,否则请避免使用宏逻辑!这是一个纯粹的数据步骤方法:

%symdel Variable_from_prior_code; /* make sure variable does not exist */
%let Some_default_value=test; /* populate macro variable */

data my_dataSet; 
  if SYMEXIST('Variable_from_prior_code') = 1 then do; /* use data step function */
    /* note variable name is quoted, else would reference a data step variable value */
    dataset_variable = symget('Variable_from_prior_code'); 
  end;
  else do;
    /* had to shorten this name to less than max allowed 32 chars */
    dataset_variable = symget('Some_default_value'); 
  end;
run;

正如汤姆所提到的,你正在混合宏观和数据步骤逻辑。宏用于写入数据步骤代码(因此本质上是程序生成器),并且在编译/解析/执行宏语句之后很久就执行结果数据步骤代码。