gpt4 book ai didi

sas - 从 sas 数据步骤动态调用宏

转载 作者:行者123 更新时间:2023-12-04 16:29:01 34 4
gpt4 key购买 nike

当作为 SAS 程序运行时,此代码可以正常执行:
%MyMacro(foo_val, bar_val, bat_val);
我使用以下方法创建了一个表:

DATA analyses;
input title : $32. weight : $32. response : $32.;
datalines;
foo1 bar1 bat1
foo2 bar2 bat2
;

我要执行 MyMacro analyses 的每一行一次 table 。

以下代码似乎只传递字符串值 title , weightresponse (而不是数据值 foo1 等)到我的宏(通过调用 %put 命令进行测试):
DATA _NULL_ ;
set analyses;
%MyMacro(title, weight, response);

RUN;

如何为 analyses 的每条记录调用一次宏表同时将数据值作为参数传递给宏?目的是为大量分析实际运行此程序,因此解决方案必须适本地扩展到 analyses 中的更多记录。 table 。

最佳答案

这部分取决于您的宏在做什么。如果我们假设您的宏正在执行一些旨在在数据步骤之外运行的操作(即,它不仅仅是分配数据步骤变量),那么您有多种选择。

  • CALL EXECUTE
  • PROC SQL: SELECT INTO宏变量
  • 将宏调用写入 %INCLUDE 文件
  • DOSUBL

  • CALL EXECUTE 已经解释过了,在某些情况下是一个不错的选择。然而,它有一些缺点,特别是在宏时序方面,在某些情况下需要额外小心保护 - 特别是当您在宏中创建宏变量时。 Quentin 在他的评论中展示了解决这个问题的方法(在调用中添加 %NRSTR),但我发现我更喜欢只在 CALL EXECUTE 比其他方法有优势时才使用 CALL EXECUTE - 特别是,如果我想使用 SAS 数据步骤技术(例如 FIRST 或 LAST,或某种形式的循环)来创建我的宏调用,或者当我无论如何必须在数据步骤中执行操作时,可以避免再次读取文件的开销.如果我只是写一个像你上面那样的数据步骤——数据一些东西,设置一些东西,调用执行,运行——我不会使用它。
    PROC SQL SELECT INTO通常是我用于列表处理的(主要是这样)。在做不太复杂的事情时,我更喜欢 SQL 的简单性;例如,您可以使用 DISTINCT 轻松获得每个宏调用的一个版本。无需显式编写 proc sort nodupkey或使用第一个/最后一个处理。它还具有调试的优势,您可以将所有宏调用写入结果窗口(如果您不添加 noprint ),如果我尝试这样做,这对我来说比日志更容易阅读看看为什么我的调用没有正确生成(并且没有使用任何额外的 PUT 语句)。
    proc sql;
    select catx(',','%macro(',arg1,arg2,arg3)||')'
    into :mvarlist separated by ' '
    from dataset;
    quit;

    &mvarlist.
    这很简单地运行它们,并且没有时间问题(因为你只是在写一堆宏调用)。
    这种方法的主要缺点是宏变量中最多有 64k 个字符,因此如果您要编写大量字符,就会遇到这种情况。在这种情况下,使用 CALL EXECUTE%INCLUDE文件。
    %INCLUDE文件作为 SELECT INTO 的替代品非常有用。当调用超过字符限制时,或者如果您发现有一个文本文件来查看您的调用很有用(例如,如果您以批处理模式运行它,这可能更容易获取和/或解析比日志或列表输出)。您只需将调用写入文件,然后 %INCLUDE那个文件。
    filename myfile temp; *or a real file if you want to look at it.;
    data _null_;
    set dataset;
    file myfile;
    length str $200;
    str=catx(',','%macro(',arg1,arg2,arg3)||')';
    put str;
    run;

    %include myfile;
    我真的不再使用这么多了,但这是一种常用技术,特别是老 SAS 程序员使用的技术,很高兴知道。
    DOSUBL是一种比较新的方法,在一定程度上可以用来代替 CALL EXECUTE因为它的默认行为通常比 CALL EXECUTE 更接近您的直觉预期。的。文档页面确实是说明其工作方式不同的最佳示例;基本上,它通过让每个单独的调用看起来从/向调用环境导入和导出宏变量来解决计时问题,这意味着 DOSUBL 的每次迭代与 CALL EXECUTE 在不同的时间运行一切都在一堆中运行并且宏环境是“固定的”(即,对宏变量的任何引用在运行时都是固定的,除非您使用 %NRSTR 将其转义)。

    还有一点值得一提的是 RUN_MACROFCMP的一部分语。这允许您完全运行宏并将其内容导入回数据步骤,这在某些情况下是一个有趣的选项(例如,您可以将调用包装在选择了某项计数的 PROC SQL 周围,然后将其导入将数据集作为变量,全部在一个数据步骤中)。如果您这样做是为了调用宏来分配数据步骤变量,而不是运行一个执行不需要导入数据步骤的事情的进程,那么它是适用的,但如果您这样做,这是值得考虑的事情确实希望该数据全部返回到调用该过程的数据集中。

    关于sas - 从 sas 数据步骤动态调用宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25545892/

    34 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com