【问题标题】:Setting a macro variable with if then statement in SAS/WPS在 SAS/WPS 中使用 if then 语句设置宏变量
【发布时间】:2021-02-02 16:42:12
【问题描述】:

我正在尝试使用 if then 语句设置宏变量,该语句使用 SAS 编程语言但使用 WPS(世界编程系统),它基本上是 SAS 克隆,但由于某种原因它不起作用。

%if 1=1 %then %do;
    data test;
    a=111;
    run;

    %let a=2;
%end;

%put &a.;

我在 put 语句后收到这条消息:

WARNING: Macro variable "&a" was not resolved

但是,测试数据集已成功创建。这只是 WPS 特定的问题,还是 SAS 中也会出现同样的错误?

更新:我尝试在宏中运行上述代码,但仍然收到相同的错误消息:

%macro test_macro();
%if 1=1 %then %do;
    data test;
    a=111;
    run;

    %let a=2;
%end;
%mend;

%test_macro();
%put &a.;

【问题讨论】:

  • 该代码是宏还是开放代码?你用的是SAS还是WPS?如果是 SAS,您使用的是什么版本的 SAS(包括维护级别)。您至少需要 SAS 的 9.4M5 版本。 blogs.sas.com/content/sasdummy/2018/07/05/…
  • @Tom 这是开放代码及其 WPS。随着数据步骤的工作,if then 语句似乎在开放代码中工作。我的代码是否适用于较新的 SAS 版本?
  • @Tom 刚刚尝试在宏中运行它,我得到了相同的错误消息

标签: sas


【解决方案1】:

如果您不告诉宏处理器您希望 A 成为全局宏符号,它将在本地宏符号表中生成。

在调用宏之前定义A:

%let a=before macro call;
%test_macro();
%put &a.;

或者在宏定义中添加一个 %GLOBAL 语句。

%macro test_macro();
  %global a;
  ...

【讨论】:

  • 谢谢,我尝试了您的建议,无论是否使用宏,它都适用于两种情况。
  • 我要补充一点,如果您打算以这种方式导出宏值,则应始终使用第二个 (%global)。 (事实上​​,我想说您应该将每个宏变量定义为 %local%global 以避免发生第一种情况 - 即,您覆盖了一个您不打算这样做的全局宏变量。)
  • 不加选择地使用 %GLOBAL 也可能在名称已在其他活动范围中使用时导致问题。您可以使用条件逻辑仅在实际需要时生成 %GLOBAL。 %if not %symexit(a) %then %global a;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多