我必须改造一个SAS项目,其中有宏变量,如下所示:
%let myDate = intnx('month',today(),-1);
以后......
data temp;
a = &myDate;
run;
我倾向于使用%sysfunc
代替:
%let myDate = %sysfunc(intnx(month,%sysfunc(today()),-1));
但是我想知道......这是一个偏好的问题还是有一些合理的理由偏好一种方法而不是另一种方法?
答案 0 :(得分:3)
对于超大型数据集,您可能会发现,对于这个特定示例,为每一行调用intnx
一次以获得相同的值会导致性能不佳,而不是定义一次宏变量并无限期地重复使用它。
Rob Penridge已经证明,在这种情况下,开销很可能是微不足道的,但对于计算密集度更高的代码,显然并非总是如此。您的里程可能会有所不同。
更一般地说,当你开始在宏变量中存储代码而不仅仅是常量时,你必须开始仔细考虑某些事情:
rsubmit
代码块时,可能需要或不需要哪种宏引用(特别是在SAS / CONNECT环境中)答案 1 :(得分:3)
您还需要考虑时间问题。如果使用%sysfunc()
,则在创建宏变量时运行该函数。如果只是将函数调用存储在宏变量中,那么在数据步骤运行之前,该函数实际上不会执行。在这种情况下,因为它正在调用today()
函数,它将针对每个观察运行。如果您在该月的最后一天午夜之前启动数据步骤,则可能会在同一数据集中的不同观察值上得到不同的A值。
答案 2 :(得分:1)
这是你正在谈论的两件不同的事情。带有%LET和DATA步骤的第一个代码将创建一个宏变量 myDate ,而不执行INTNX函数,但会创建一个列 a
的表但是,第二个修改后的%LET语句实际上只会创建一个宏变量,其值为INTNX函数。
因此,它实际上取决于业务需求是什么 -
创建表格
OR
创建一个宏变量,可以创建一次并反复使用。
答案 3 :(得分:1)
这是个人偏好的问题。我个人喜欢使用%sysfunc
方法,因为它允许我调试/打印结果而无需处理任何数据操作。
真的,我会说任何可以提高可读性和可维护性的东西。如果您正在与讨厌使用宏的人一起工作,那么请考虑使用更简单的第一种方法。课程的马。