用于 !!在 SAS 中调用 Symput
use of !! in Call Symput in SAS
谁能告诉我这个数据步骤在做什么?我从未见过使用“!!”还是 "double exclamation mark" 之前?
data _null_;
set &dset_in.;
if i = _n_ then do i=1 to nvar;
call symput ("var" !! strip(put(_n_, 3.)), strip(Variabile));
call symput ("min" !! strip(put(_n_, 3.)), strip(lim_inf));
call symput ("max" !! strip(put(_n_, 3.)), strip(lim_sup));
end;
run;
循环的一般要点也会有帮助,谢谢
它只是用于连接(而不是 ||
)。
!!根据文档是连接运算符:
代码正在创建一组宏变量 VAR001、MIN001 MAX001 以将值存储在数据集中。一般来说,这是一种不好的做法,如果您需要这样做,通常会有更简单的方法。
回答问题的第二部分,它所做的是:
有一个变量 i
,它有一些值指示用户要从中检索值的行。当到达那一行时,三个变量中的值存储在宏变量中,名称中有行号,例如如果i=5,则取第5行,并将三个变量放入&var005
, &min005
, &max005
.
但是,此代码存在许多问题。首先,在该循环中重用 i
是个坏主意;虽然它不会做任何永久性的事情,但它很容易通过其他 features/bugfixes.
可能产生的微小变化来实现
其次,当前构造的循环毫无意义。它没有根据 i
做任何事情,所以它只是将相同的 3 个值多次放入相同的 3 个宏变量中。在我看来,这是某人对他们从互联网上复制的代码的理解,但有点误解。
它应该做的事情大概是这样的:
data _null_;
set &dset_in.;
call symput ("var" !! strip(put(_n_, 3.)), strip(Variabile));
call symput ("min" !! strip(put(_n_, 3.)), strip(lim_inf));
call symput ("max" !! strip(put(_n_, 3.)), strip(lim_sup));
run;
这将为名称中包含行号的每一行创建宏变量,使用自动数据步循环。不过,这只是一个猜测,除了我在这里看到的以外,我对该程序一无所知。
但这就是全部,需要注意的是整个操作是个坏主意;将数据值存储在宏变量中是糟糕的编程习惯。别这样。
谁能告诉我这个数据步骤在做什么?我从未见过使用“!!”还是 "double exclamation mark" 之前?
data _null_;
set &dset_in.;
if i = _n_ then do i=1 to nvar;
call symput ("var" !! strip(put(_n_, 3.)), strip(Variabile));
call symput ("min" !! strip(put(_n_, 3.)), strip(lim_inf));
call symput ("max" !! strip(put(_n_, 3.)), strip(lim_sup));
end;
run;
循环的一般要点也会有帮助,谢谢
它只是用于连接(而不是 ||
)。
!!根据文档是连接运算符:
代码正在创建一组宏变量 VAR001、MIN001 MAX001 以将值存储在数据集中。一般来说,这是一种不好的做法,如果您需要这样做,通常会有更简单的方法。
回答问题的第二部分,它所做的是:
有一个变量 i
,它有一些值指示用户要从中检索值的行。当到达那一行时,三个变量中的值存储在宏变量中,名称中有行号,例如如果i=5,则取第5行,并将三个变量放入&var005
, &min005
, &max005
.
但是,此代码存在许多问题。首先,在该循环中重用 i
是个坏主意;虽然它不会做任何永久性的事情,但它很容易通过其他 features/bugfixes.
其次,当前构造的循环毫无意义。它没有根据 i
做任何事情,所以它只是将相同的 3 个值多次放入相同的 3 个宏变量中。在我看来,这是某人对他们从互联网上复制的代码的理解,但有点误解。
它应该做的事情大概是这样的:
data _null_;
set &dset_in.;
call symput ("var" !! strip(put(_n_, 3.)), strip(Variabile));
call symput ("min" !! strip(put(_n_, 3.)), strip(lim_inf));
call symput ("max" !! strip(put(_n_, 3.)), strip(lim_sup));
run;
这将为名称中包含行号的每一行创建宏变量,使用自动数据步循环。不过,这只是一个猜测,除了我在这里看到的以外,我对该程序一无所知。
但这就是全部,需要注意的是整个操作是个坏主意;将数据值存储在宏变量中是糟糕的编程习惯。别这样。