如何在日志中打印出宏变量的数据类型
%macro mymacro(dt2);
%LET c_mth = %SYSFUNC(intnx(month,&dt2.d,-1,e),date9.) ;
%put &c_mth;
%mend;
mymacro('01sep2014')
我使用 %let 或 into 分配了一堆宏变量:
我的问题是我试图在日期上做一堆 bool 条件,但我怀疑我的一些变量是字符串,有些是日期
我已经在我的代码中转换了它们,但是要三重检查肯定有一种方法可以将某些内容返回到日志中
我想要类似于在 R 中使用 str() 或 mode() 或 is.numeric() 的东西
最佳答案
H,
SAS 宏语言很奇怪。 :)
正如 Reeza 所说,宏变量没有类型,它们都是文本。
但是,如果您使用 bool 逻辑(%IF 语句),并且两个操作数都是整数,则宏语言将进行数字比较而不是字符比较。
因此,您可以使用 INPUTN() 函数将日期字符串转换为 SAS 日期(自 01Jan1960 以来的天数),然后进行比较。这是一个示例,从您的代码中跳出:
%macro mymacro(dt1,dt2);
%local c_mth1 c_mth2 n_mth1 n_mth2;
%let c_mth1 = %sysfunc(intnx(month,&dt1.d,-1,e),date9.) ;
%let c_mth2 = %sysfunc(intnx(month,&dt2.d,-1,e),date9.) ;
%let n_mth1 = %sysfunc(inputn(&c_mth1,date9.)) ;
%let n_mth2 = %sysfunc(inputn(&c_mth2,date9.)) ;
%put &c_mth1 -- &n_mth1;
%put &c_mth2 -- &n_mth2;
%if &n_mth1<&n_mth2 %then %put &c_mth1 is before &c_mth2;
%else %put &c_mth1 is NOT before &c_mth2;
%mend;
从示例调用记录:
236 %mymacro('01feb1960','01mar1960')
31JAN1960 -- 30
29FEB1960 -- 59
31JAN1960 is before 29FEB1960
——问。
关于sas - 如何计算 SAS 中宏变量的数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28467405/