【问题标题】:how to use a %let macro inside of a hash table in SAS如何在 SAS 的哈希表中使用 %let 宏
【发布时间】:2021-01-01 20:19:51
【问题描述】:

我正在更新一个使用哈希表的程序。并且程序有很多重复的变量,这些变量会定期更改。 我一直在更新它们以引用包含这些变量的宏代码的程序,因此我们不必一一更改它们,并且它在我所有其他项目中一直像魅力一样工作,但我正在努力处理这些哈希表 例如

%let year = x2020;
data acute &year.;
  if 0 then set a_&syear.;
  if _n_=1 then do;
    declare has Tx(dataset:"Ty");
    Tx.defineData("city","&year.");
    Tx.define();
    call missing(city,&year.);
  end;
....
run;

我已将其范围缩小到使用 &year。在 Tx.defineData 行中。 它似乎没有在引号内选择宏,并且出现此错误:

未声明的数据符号 &year。因为有对象

虽然我通常对引号内的宏没有问题。 我尝试将 let 函数更改为 %let year = "x2020"; 并将 dequote() 用于不需要引号的区域,我也尝试使用 quote(&year.) 代替但得到

未声明的数据符号“。”对于哈希对象....

有没有人想出在这种情况下使用 let 宏的方法?

【问题讨论】:

    标签: hash sas hashtable sas-macro


    【解决方案1】:

    你的主要问题是,

    您正在尝试使用以数字开头的数据集和字段的名称。 SAS 中的名称应以字母或下划线开头,并且仅包含字母、下划线和数字。如果不是,它们应该以不同的方式书写。

    • 写入"name with blanks"n 以创建名为name with blanks 的变量或数据集
    • 写入"1_2_3"n 以创建名为name with blanks 的变量或数据集

    现在可以了,但我建议你不要这样做,因为语法变得相当复杂。

    您的代码不完整,包含很多错字。

    因此,我不得不猜测你真正想要做什么。 如果您为我们剪切并粘贴它会有所帮助,或者更好的是剪切并粘贴日志,这样我们就可以确切地知道您做了什么。

    数据步骤

    我假设使用data acute &year.;,您只想创建一个名为acute 2020 的数据集。如果是这样,你应该写data "acute &year."n;,但我实际上建议你重命名你的数据集并写data acute_&year.;

    您可能还想在一个数据步骤中创建数据集 acute2020。那你应该写data acute "&year"n.;

    哈希表的声明

    首先,不是declare has,而是declare hash,也不是Tx.define();,而是Tx.defineDONE();

    如果使用Tx.defineData("city","&year.");,您想指定字段city2020 应该用作数据,这应该可以,因为在这里您将变量名称指定为字符串,而不是SAS 名称。

    错误其实在call missing(city,&year.);这里应该使用特殊语法call missing(city,"&year."n);

    再次,我建议您将变量重命名,例如重命名为 _2020,这样您就可以将其写为 _&year.

    【讨论】:

    • 对不起,我的工作是一个安全的网络,所以我不得不对代码进行过渡并手动复制它。该变量实际上并不以数字开头,我现在将其编辑为您的建议_2020。这段代码是继承的,但我尝试了使用和不使用宏的调用缺失行,无论哪种方式都没有问题,但我还是尝试了你的建议,但它仍然无法正常工作。
    猜你喜欢
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-16
    相关资源
    最近更新 更多