【问题标题】:symputx won't let me store different macro variables with the same macro functionsymputx 不允许我使用相同的宏函数存储不同的宏变量
【发布时间】:2019-12-11 19:43:24
【问题描述】:

我正在尝试编写一个宏函数,该函数从数据集中获取属性,然后将它们存储为宏变量。我想把这个宏函数写成可以用于多个数据集和多个宏变量的方式。

这是怎么回事:

%macro ExtractACell(dataset, storage_var, rownum=1, var_name=Make);
data _null_;
    set &dataset. (obs=&rownum. firstobs=&rownum. keep = &var_name.);   
    call symputx(&storage_var., &var_name., "G");
    stop;
run;
%mend ExtractACell;

每当我尝试运行时,我都会收到如下注释:

 NOTE: The quoted string currently being processed has become more than 262 bytes long.  You might have unbalanced quotation marks.
 NOTE: The quoted string currently being processed has become more than 262 bytes long.  You might have unbalanced quotation marks.
 27         %let SASWORKLOCATION="%sysfunc(getoption(work))/";

symputx 是否有禁止传入代表宏变量名称的宏变量的规则?

【问题讨论】:

  • 你能说明你如何调用宏吗? storage_var 等于什么值?我认为,您应该使用 call symputx(“&storage_var.”,”&var_name”,”G”)
  • 如果您存储在宏变量中的值是一个长度超过 262 个字符的字符串,您始终可以使用选项 NOQUOTELENMAX;抑制警告。您可以使用超过 262 个字符的字符串,但 SAS 会警告您,因为较长的字符串有时是不平衡引号的结果。

标签: sas sas-macro


【解决方案1】:

确保在扩展宏变量时生成有效的 SAS 代码。特别是这个声明:

call symputx(&storage_var., &var_name., "G");

将要求您在要创建的宏变量的名称周围加上引号来调用宏。像这样:

%ExtractACell(dataset=sashelp.cars, storage_var="mymvar", rownum=1, var_name=Make);

使用此语句编写宏代码可能更简单。

call symputx("&storage_var", &var_name., "G");

然后您可以在宏变量名称周围不带引号的情况下调用:

%ExtractACell(dataset=sashelp.cars, storage_var=mymvar, rownum=1, var_name=Make);

PS 如果你需要那个宏,你的整个过程可能会搞砸。

【讨论】:

    猜你喜欢
    • 2014-02-22
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    • 2012-06-14
    相关资源
    最近更新 更多