我有一个SAS宏,我需要转换为R,因为我是SAS的新手,我在理解代码的一部分时遇到了一些麻烦。
在宏的开头,我有这行定义宏 -
%MACRO macroname(sdate=01JAN2011,edate=01JAN2013, FILTERS=platform in (1,2,3),OUT=data_final)
%if %length(&filters) > 2 %then %let filters = and &filters;
%else %let filters = %str( );
在宏的一个阶段中,我有以下命令 -
proc sort data = A noduplicates;
where 1 &filters;
by id, date;
run;
据我所知,在where条件下,将应用过滤条件。但是1做了什么?类似地,过滤器列上的if else条件有什么作用?
谢谢!
答案 0 :(得分:2)
这也可以写成1 = 1,并且基本上是静态TRUE条件。
这实际上是一个巧妙的小技巧,可以解决添加多个where子句(作为宏变量)的问题。每个条件必须由运算符分隔(AND / OR,通常为AND),但并不总是知道另一个条件是否在之前。例如,您可能希望灵活地将相同的&filter
添加到这两个地方:{/ p>
where x=1 &filter;
where &filter;
当然第一个示例必须解析为x=1 AND some=filter;
,第二个示例必须不解析为where AND some=filter;
请记住,where子句中的任何条件最终都会解析为true或false。通过添加“1”,我们有一个静态的“TRUE”条件,它对查询没有影响,但确实给了我们代码的灵活性(和可读性)(基本上避免了更多的宏%if%else 语句)如果我们总是将“AND”添加到& filter。
where 1 &filter
而不是
where %if %length(&filter)>4 and "%substr(%upcase(&filter))" ne AND %then %do;
where 1 and &filter
%end;
%else %do;
where &filter
%end;