1

谁能告诉我这个数据步骤在做什么?我从未见过“!!”的用法 还是之前的“双感叹号”?

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;

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

4

3 回答 3

4

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

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

该代码正在创建一组宏变量 VAR001、MIN001 MAX001 以将值存储在数据集中。一般来说,这是一种不好的做法,如果你需要这样做,通常会有一种更简单的方法。

于 2018-10-04T16:06:20.273 回答
2

回答问题的第二部分,它正在做的是:

有一个变量i,它具有一些值,指示用户想要从中检索值的行。当到达该行时,三个变量中的值存储在名称中带有行号的宏变量中,例如如果 i=5,则取第 5 行,并将三个变量放入&var005, &min005, 中&max005

但是,此代码存在许多问题。首先,i在那个循环中重用是个坏主意。虽然它不会做任何永久性的事情,但它很容易通过其他功能/错误修正引起的微小变化。

其次,当前结构的循环是没有意义的。它没有做任何基于 的事情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;

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

但这就是警告,整个操作是个坏主意。将数据值存储在宏变量中是不好的编程习惯。不要这样做。

于 2018-10-04T20:55:17.907 回答
2

它仅用于连接(代替||)。

于 2018-10-04T16:06:15.410 回答