用于 !!在 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;

循环的一般要点也会有帮助,谢谢

它只是用于连接(而不是 || )。

!!根据文档是连接运算符:

https://documentation.sas.com/?docsetId=lrcon&docsetVersion=9.4&docsetTarget=p00iah2thp63bmn1lt20esag14lh.htm&locale=en

代码正在创建一组宏变量 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;

这将为名称中包含行号的每一行创建宏变量,使用自动数据步循环。不过,这只是一个猜测,除了我在这里看到的以外,我对该程序一无所知。

但这就是全部,需要注意的是整个操作是个坏主意;将数据值存储在宏变量中是糟糕的编程习惯。别这样。