использование !!в Call Symput в SAS - PullRequest
0 голосов
/ 04 октября 2018

Может кто-нибудь сказать мне, что делает этот шаг данных?Я никогда не видел использование "!!"или "двойной восклицательный знак" раньше?

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;

Общая суть цикла тоже будет полезна, спасибо

Ответы [ 3 ]

0 голосов
/ 04 октября 2018

!!является оператором конкатенации в соответствии с документацией:

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

Код создает набор макропеременных VAR001, MIN001 MAX001 для хранения значений в наборе данных.В общем, это плохая практика, если вам нужно сделать это, как правило, есть более простой способ.

0 голосов
/ 04 октября 2018

Отвечая на вторую часть вопроса, он делает следующее:

Существует переменная 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;

Это создаст макропеременные для каждой строки с номером строки в имени, используяавтоматический шаг данных петли.Однако это всего лишь предположение, не зная ничего о программе, кроме того, что я вижу здесь.

Но это все с оговоркой, что вся эта операция - плохая идея;хранение значений данных в макропеременных является плохой практикой программирования.Не делай этого.

0 голосов
/ 04 октября 2018

Используется только для конкатенации (вместо ||).

...