我有以下代码:
%MACRO CALCU(DATE_VAR);
%get_filenames('./subgroup/groups',filenames);
data _null_;
set filenames;
by fname;
%put go;
if fname =: "&TIME_INTERVAL";
call execute(cats('%nrstr(%ACTUAL_CAL)(',&DATE_VAR,',',fname,')'));
run;
%mend;
当我这样称呼时:
%CALCU(cq2014);
被调用的字符串实际上是
%ACTUAL_CAL(.,MINUTE15_group0.csv)
而不是%ACTUAL_CAL(cq2014,MINUTE15_group0.csv)
我想知道为什么会这样?是不是在cat语句中不能使用宏变量?
答案 0 :(得分:0)
似乎我不应该让猫变成宏变量。相反,我应该这样做:
call execute(cats('%nrstr(%ACTUAL_CAL)(&DATE_VAR,',fname,')'));
答案 1 :(得分:0)
SAS宏处理器主要只是进行简单的文本替换。如果你写这行代码:
call execute(cats('%nrstr(%ACTUAL_CAL)(',&DATE_VAR,',',fname,')'));
&DATA_VAR
将被其值替换。所以你得到这行SAS代码。
call execute(cats('%nrstr(%ACTUAL_CAL)(',cq2014,',',fname,')'));
因此cats()
函数的第二个参数是名为cq2014
的变量。因此,变量cq2014
的值将用于生成要传递给call execute()
的字符串。如果先前没有定义变量,那么SAS将使用该名称创建一个新变量,并且它将在数据步骤中为所有观察值保留缺失值。
您应该在日志中看到一条说明cq2014
未初始化的说明。
因此,您可以使用双引号将宏变量评估为数据步骤中的字符串文字。
call execute(cats('%nrstr(%ACTUAL_CAL)(',"&DATE_VAR,",fname,')'));
或者使用单引号,当调用execute()将字符串推送到数据步骤结束后运行的命令堆栈上时,将对其进行求值。
call execute(cats('%nrstr(%ACTUAL_CAL)(&DATE_VAR,',fname,')'));