Dynamic 如果存在宏变量,则输入值其他值

Dynamic 如果存在宏变量,则输入值其他值,dynamic,sas,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_p

需要在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;
然而,当编译器试图运行它时,这会失败,因为“明显的符号引用&来自于前一个代码的变量”尚未解决。即使不满足条件,编译器也会检查if语句的内容

我想出了一个愚蠢的办法:从对面的directon着手,但感觉比一袋獾更愚蠢:

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;
有没有办法限制编译器对内容求值,而这不应该是由条件造成的?
或者,更优雅的解决方法,不需要创建变量?

我想说,除非必要,否则避免使用宏逻辑!以下是一种纯数据步骤方法:

%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;

正如Tom提到的,您当前正在混合宏和数据步骤逻辑。宏用于编写数据步骤代码(因此本质上是一个程序生成器),生成的数据步骤代码在宏语句编译/解析/执行后很长时间内执行。

您将宏逻辑(用于生成代码)和数据步骤逻辑混为一谈。如果将代码包装到宏中,则可以使用%If有条件地生成代码。symget做到了这一点。测试并确认工作正常。同意。宏逻辑是坏的jujuju。然而,需要是这样的:((合并两个旧工作流,并允许仅编辑选定的少数文件。'))