Um ein Programm zu refactorieren, habe ich einen komplexen Prozess, den ich abstrahieren möchte, in ein Makro eingefügt.SAS: Aufruf von Makro aus einer Datenschrittschleife
Der Prozess muss mehrmals hintereinander ausgeführt werden, daher ist es naheliegend, ihn in eine Schleife zu stellen.
data _null_;
do i = 1 to 3;
%BlackBox();
end;
run;
Dies erzeugt jedoch den folgenden Fehler.
ERROR 117-185: There was 1 unclosed DO block.
Was passiert?
Meine beste Schätzung ist, dass SAS versucht, einen Datenschritt innerhalb eines Datenschritts auszuführen.
Ich finde, dass ich diesen Fehler vermeiden kann, indem ich meine Schleife innerhalb eines Makros einschließe und dann das Makro sofort rufe.
%macro PerformDoLoop();
%do i = 1 %to 3;
%BlackBox();
%end;
%mend;
%PerformDoLoop;
All dies scheint wie eine Umgehungsart der Handhabung einer grundlegenden Programmieraufgabe. Ich hoffe, dass ich mehr darüber erfahren kann, warum der Data-Step-Ansatz fehlschlägt.
Bitte haben Sie Verständnis dafür, dass dies ein vereinfachtes Beispiel zur Veranschaulichung des Fehlers ist, dem ich begegne. Eine reale Instanz des Makros kann Argumente oder Rückgabewerte annehmen.
Wie immer, danke, Joe. Um meine Aktionen zu erklären, ist das Makro '% PerformDoLoop' nicht dazu gedacht, eine Methode zum Ausführen der Schleife zu schreiben. Es ist buchstäblich die Schleife selbst durchzuführen. In jeder anderen Sprache kann eine Schleife im offenen Code aufgerufen werden. Nicht so in SAS. Eine Schleife muss stattdessen entweder in einen "Daten _null_" oder in einen Makro-Mend-Call-Block wie oben beschrieben eingewickelt werden. In Wirklichkeit nimmt meine BlackBox ein Argument. Da ich BlackBox für verschiedene Argumente aufrufen muss, habe ich eine Makroliste (als Pseudo-Array) erstellt. BlackBox wird dann ein anderes Argument unter Verwendung des Arrays und des do-Schleifenindexes zugeführt. –
@LoremIsump Wenn Sie das tun, dann würde ich das Schleifenmakro nicht schreiben - anstatt die Makroliste der Parameter zu erstellen, erstellen Sie einfach eine Makroliste der Aufrufe von BlackBox. Ich würde auch vorschlagen, dass SAS nicht besonders einzigartig darin ist, keine Schleifen in offenem Code zu haben; Sie könnten das auch nicht in C machen, für ein besonders offensichtliches Beispiel müsste es in einer Subroutine sein. Das Gleiche gilt für SAS, es ist nur eine erzwungene Code-Kapselung. Das heißt, in SAS 9.5 sieht es so aus, als würden sie _die Makrosteuerung (% do usw.) außerhalb von Makros erlauben, obwohl ich nicht überzeugt bin, dass das eine gute Sache ist. – Joe
Interessanter Punkt über 9.5. Ich hatte bei SGF gehört, dass die Open Statement% IF in 9.5 kam. Und stimme zu, ich bin mir nicht sicher, ob es auch gut ist. Haben Sie schon einmal darüber nachgedacht, wie es umgesetzt wird? – Quentin