我继承了37,000多行SAS脚本,不包括其他继承模块。鉴于初学者对SAS的了解以及对Python的熟悉知识,我想知道这是否被认为是过度的,因为在我看来,以及建议分层和拆分典型的SAS脚本。
由于
答案 0 :(得分:4)
这是SAS的一个常见问题,因为许多编写SAS程序的人都有分析背景而不是高效编程。我建议的第一件事是在宏定义中放置一个代码块,然后测试调用宏并在执行其余代码之前用ENDSAS语句结束程序。这将允许您运行诊断程序以确定该代码块的作用。一旦理解了代码的作用,就可以决定是否要将这些代码分解为更多宏定义,以使每个宏执行一组逻辑上有凝聚力的指令。
进入程序后,您可能会发现类似的代码重复,但有一些差异,例如参数选择,数据集名称或变量。如果您发现这种类型的重复,那么您可以设计一个使用参数来概括代码的宏。之后,您可以使用宏调用替换重复实例,根据需要更改参数。
类似地,对于那么长的脚本,我希望你会找到一个插入DO循环的地方将有助于添加结构,无论是在宏定义内还是在DATA步骤中。
但有时,SAS程序只需要多行代码。将其分解为宏定义的逻辑步骤将有助于其可读性和维护性,但它对提高效率几乎没有作用。在这些情况下,您应该做的最少的是在顶部附近编写一个注释部分,简要描述程序的用途,然后在整个代码中添加注释,以解释特定代码块正在做什么。
但是,这是这项技术的两个注意事项。首先,如果原始程序定义了宏变量,那么如果在宏中定义它们,则可能会对这些变量的范围产生问题。在宏定义之外定义的宏变量是全局的;但除非您指定它们应该是全局的,否则在宏定义中定义的宏变量(以及调用宏时设置的宏参数)将是本地的,并且在宏执行后将不可用。类似的问题是,多个宏变量可以具有相同的名称,但它们的范围不同,这可能会在返回时导致意外的值。第二个警告是,如果您使用宏定义注释掉大块代码,以便您可以在不同的运行中测试代码的后续部分,那么请确保将任何必要的数据集保存到永久位置;否则它们将被删除,不能用于以后的测试。
祝你好运。答案 1 :(得分:3)
我认为,只有将REPETITIVE代码块(或需要宏处理的代码块)放入%宏块中才是更好的做法。如果单独一个注释就足以描述一段代码的目的那么通常这是一种更好的方法。
将代码放入没有宏相关处理的宏块中只会混淆简单的SAS代码。这就像将现有函数包装到您自己的用户定义函数中,而不向其添加任何其他功能。
让37k LOC绝对过分(对于单个程序)并且我确信其中大部分都是重复的,所以@ RWill的答案仍然非常有效。我认为更好的方法是将代码分成多个文件(每个文件都有特定目的),然后可以使用%include 语句调用。通过这种方式,您可以避免使用许多(可能)不必要的宏,并使其更加自我记录。
干杯 罗布
答案 2 :(得分:2)
@RWill提出了很好的建议。使用%宏块进行切片非常有助于一次运行一段代码。 使用企业指南(我使用的是4.3)也允许将代码分成几部分。可以创建和链接代码节点,以便程序可以一次运行一个部分,也可以运行整个分支。此外,输出数据集可视地连接到程序块。