是否建议将 sas 代码存储在宏变量中?
Is storing sas code in macro variables recommended?
我必须改造一个 SAS 项目,其中有如下宏变量:
%let myDate = intnx('month',today(),-1);
以后...
data temp;
a = &myDate;
run;
我倾向于使用 %sysfunc
:
%let myDate = %sysfunc(intnx(month,%sysfunc(today()),-1));
但我想知道...这是一个偏好问题还是有充分的理由更喜欢一种方法而不是另一种方法?
你说的是两个不同的东西。带有 %LET 和 DATA 步骤的第一个代码将创建一个宏变量 myDate 而不执行 INTNX 函数,但会创建一个 Table 列 a
但是,第二个改进的 %LET 语句实际上只会创建一个宏变量,其值为执行的 INTNX 函数。
所以,这实际上取决于业务需求是什么 -
创建Table
或者
创建一个宏变量,它可以创建一次并反复使用。
这是个人喜好问题。我个人喜欢使用 %sysfunc
方法,因为它允许我 debug/print 结果而无需处理任何数据步骤。
真的,我会说任何允许更好的可读性和可维护性的内容。如果您正在与讨厌使用宏的人一起工作,那么请考虑使用更简单的第一种方法。课程用马。
对于非常大的数据集,您可能会发现,在这个特定示例中,为每一行调用一次 intnx
以获得相同的值会导致性能较差,而不是定义一个宏变量并重新使用它无限期地。
Rob Penridge 已经证明,在这种情况下,开销可能可以忽略不计,但对于计算量更大的代码,情况显然并非总是如此。您的里程可能会有所不同。
更一般地说,当您开始在宏变量中存储代码而不仅仅是常量时,您必须开始非常仔细地考虑某些事情:
- 可能需要也可能不需要哪种宏引用(特别是在 SAS/CONNECT 环境中,当您需要
rsubmit
使用宏变量的代码块时)
- 您的宏变量是否包含分号或其他可能导致与其他代码块发生意外交互的字符
- 它是否包含您不想在代码执行之前解析的宏引用
你还需要考虑时机的问题。如果你使用 %sysfunc()
那么在创建宏变量时函数 运行s。如果您只是将函数调用存储在宏变量中,那么该函数实际上不会执行,直到数据步骤为 运行ning。在这种情况下,由于它正在调用 today()
函数,因此每次观察都会 运行 。如果您在该月最后一天的午夜之前开始您的数据步骤,您可能会在同一数据集中的不同观察结果中得到不同的 A 值。
我必须改造一个 SAS 项目,其中有如下宏变量:
%let myDate = intnx('month',today(),-1);
以后...
data temp;
a = &myDate;
run;
我倾向于使用 %sysfunc
:
%let myDate = %sysfunc(intnx(month,%sysfunc(today()),-1));
但我想知道...这是一个偏好问题还是有充分的理由更喜欢一种方法而不是另一种方法?
你说的是两个不同的东西。带有 %LET 和 DATA 步骤的第一个代码将创建一个宏变量 myDate 而不执行 INTNX 函数,但会创建一个 Table 列 a
但是,第二个改进的 %LET 语句实际上只会创建一个宏变量,其值为执行的 INTNX 函数。
所以,这实际上取决于业务需求是什么 -
创建Table
或者
创建一个宏变量,它可以创建一次并反复使用。
这是个人喜好问题。我个人喜欢使用 %sysfunc
方法,因为它允许我 debug/print 结果而无需处理任何数据步骤。
真的,我会说任何允许更好的可读性和可维护性的内容。如果您正在与讨厌使用宏的人一起工作,那么请考虑使用更简单的第一种方法。课程用马。
对于非常大的数据集,您可能会发现,在这个特定示例中,为每一行调用一次 intnx
以获得相同的值会导致性能较差,而不是定义一个宏变量并重新使用它无限期地。
Rob Penridge 已经证明,在这种情况下,开销可能可以忽略不计,但对于计算量更大的代码,情况显然并非总是如此。您的里程可能会有所不同。
更一般地说,当您开始在宏变量中存储代码而不仅仅是常量时,您必须开始非常仔细地考虑某些事情:
- 可能需要也可能不需要哪种宏引用(特别是在 SAS/CONNECT 环境中,当您需要
rsubmit
使用宏变量的代码块时) - 您的宏变量是否包含分号或其他可能导致与其他代码块发生意外交互的字符
- 它是否包含您不想在代码执行之前解析的宏引用
你还需要考虑时机的问题。如果你使用 %sysfunc()
那么在创建宏变量时函数 运行s。如果您只是将函数调用存储在宏变量中,那么该函数实际上不会执行,直到数据步骤为 运行ning。在这种情况下,由于它正在调用 today()
函数,因此每次观察都会 运行 。如果您在该月最后一天的午夜之前开始您的数据步骤,您可能会在同一数据集中的不同观察结果中得到不同的 A 值。