Sas 从数据集合中的宏函数返回并分配全局值

Sas 从数据集合中的宏函数返回并分配全局值,sas,Sas,不太确定执行以下操作的最佳方法-我想从数据步骤中调用宏函数,将现有列中的值作为参数传递,并将宏函数生成的值分配给新列。我对任何方法都持开放态度——PROC-SQL、CALL-EXECUTE等等 %macro simple(x=); %global value; %let value = %sysfunc(intnx(month, %sysfunc(today()), &x, same)); %put &value; %mend simple; %simp

不太确定执行以下操作的最佳方法-我想从数据步骤中调用宏函数,将现有列中的值作为参数传递,并将宏函数生成的值分配给新列。我对任何方法都持开放态度——PROC-SQL、CALL-EXECUTE等等

%macro simple(x=);
    %global value;
    %let value = %sysfunc(intnx(month, %sysfunc(today()), &x, same)); 
    %put &value;
%mend simple;
%simple(x=1);

data have;
    do x = 1 to 15;
        output;
    end;
run;

data want;
    data have;
        newdate = %simple(x);
run;

请注意对%SIMPLE的更改及其调用位置。“解决”适用于这种情况,但
%复杂:-)不会。此外,最好不用调用宏即可完成此操作—所有操作都可以在数据步骤中完成。我希望你能更好地利用这一点,而不是工作保障

%macro simple(x=);
   %sysfunc(intnx(month, %sysfunc(today()), &x, same))
   %mend simple;

%put NOTE: %simple(x=1);

data have;
    do x = 1 to 15;
        output;
    end;
run;

data want;
   set have;
   newdate = input(resolve(cats('%simple(x=',x,')')),F16.);
   format newdate date9.;
   run;
proc print;
   run;

请注意对%SIMPLE的更改及其调用位置。“解决”适用于这种情况,但
%复杂:-)不会。此外,最好不用调用宏即可完成此操作—所有操作都可以在数据步骤中完成。我希望你能更好地利用这一点,而不是工作保障

%macro simple(x=);
   %sysfunc(intnx(month, %sysfunc(today()), &x, same))
   %mend simple;

%put NOTE: %simple(x=1);

data have;
    do x = 1 to 15;
        output;
    end;
run;

data want;
   set have;
   newdate = input(resolve(cats('%simple(x=',x,')')),F16.);
   format newdate date9.;
   run;
proc print;
   run;

如果您想在语句的中间使用宏,例如:

newdate = %simple(x);
然后宏只能发出语句的一部分。这不是分号

在本例中,如果定义宏以生成对INTNX()的调用,则可以在赋值语句中以这种方式使用它

%macro simple(value);
  intnx('month',%sysfunc(today()),&value,'same')
%mend simple;
因此,如果今天()是2018年11月20日,那么您在数据步骤中有效地运行了这个有效的SAS语句

newdate = intnx('month',21508,x,'same') ;
注意变量X的名称是如何传递给宏的,以及在生成的SAS代码段中使用的


当然,如果您想尝试在SAS语句之外使用宏,那么宏现在是无用的

> P>如果您想在语句的中间使用宏,例如:

newdate = %simple(x);
然后宏只能发出语句的一部分。这不是分号

在本例中,如果定义宏以生成对INTNX()的调用,则可以在赋值语句中以这种方式使用它

%macro simple(value);
  intnx('month',%sysfunc(today()),&value,'same')
%mend simple;
因此,如果今天()是2018年11月20日,那么您在数据步骤中有效地运行了这个有效的SAS语句

newdate = intnx('month',21508,x,'same') ;
注意变量X的名称是如何传递给宏的,以及在生成的SAS代码段中使用的


当然,如果您想尝试在SAS语句之外使用宏,那么宏现在是无用的

你能改用PROC FCMP吗?DOSUBL可能会在同一会话中返回,但调用EXECUTE是在数据步骤结束之后,因此不会执行您想要的操作。您好!如果你能提供一个有帮助的例子,我也会同时研究PROC FCMP。你上面的例子有代表性吗?这个函数真的是你想要做的吗?它确实更简单,但我认为它抓住了我的问题。如果解决方案似乎不符合我的实际情况,我可以尝试更新我的帖子。不要在你指的
set
位置使用
data
。将格式添加到新变量中,使其以可读格式打印日期可能很有用。可以改用PROC FCMP吗?DOSUBL可能会在同一会话中返回,但调用EXECUTE是在数据步骤结束之后,因此不会执行您想要的操作。您好!如果你能提供一个有帮助的例子,我也会同时研究PROC FCMP。你上面的例子有代表性吗?这个函数真的是你想要做的吗?它确实更简单,但我认为它抓住了我的问题。如果解决方案似乎不符合我的实际情况,我可以尝试更新我的帖子。不要在你指的
set
位置使用
data
。在新变量中添加一种格式,以便它以可读的格式打印日期,这可能很有用。您是否介意在数据步骤中演示如何实现这一点?我似乎也无法做到这一点——如果必要的话,我可以展示我在帖子中尝试过的内容。
input(resolve(…)
是一种我不知道的编码模式——我肯定我会不必要地滥用它,在数据步骤中而不是在宏代码中调用
intnx()
,只是不要将其包装在
%sysfunc()中
.Hi@Tom-我已经用示例代码(在底部)编辑了我的文章-它没有给我预期的输出…您介意在数据步骤中演示如何实现这一点吗?我似乎也无法做到这一点——如果必要的话,我可以展示我在帖子中尝试过的内容。
input(resolve(…)
是一种我不知道的编码模式——我肯定我会不必要地滥用它,在数据步骤中而不是在宏代码中调用
intnx()
,只是不要将其包装在
%sysfunc()中
.Hi@Tom-我用示例代码编辑了我的文章(在底部)-它没有给我预期的输出…太酷了!在现实生活中,我使用的是一个多行宏函数,所以这两个选项都很好这很酷!在现实生活中,我使用的是一个多行宏函数,所以这两个选项都很好