프로그램을 리팩터링하기 위해 매크로로 추상화하고 배치하고자하는 복잡한 프로세스를 수행했습니다.SAS : 데이터 스텝 루프 내에서 매크로 호출하기
%macro BlackBox();
data _null_;
put "This represents a complex process I want to abstract.";
run;
%mend;
과정은 연속적으로 여러 번 발생해야하므로 확실한 해결책은 루프 내에 배치하는 것입니다.
data _null_;
do i = 1 to 3;
%BlackBox();
end;
run;
그러나이 오류는 다음과 같습니다.
ERROR 117-185: There was 1 unclosed DO block.
무슨 일입니까?
SAS는 데이터 단계 내에서 데이터 단계를 실행하려고합니다.
매크로 내에서 루프를 감싸고 즉시 매크로를 호출하여이 오류를 피할 수 있습니다.
이 모든 것이 기본적인 프로그래밍 작업을 처리하는 원형적인 방법처럼 보입니다. 데이터 단계 접근 방식이 실패한 이유에 대해 더 자세히 배우려면이 작업을보다 우아하게 완료하는 방법에 대한 통찰력이 필요합니다.
이것은 발생하는 오류를 설명하기 위해 사용 된 단순화 된 예입니다. 매크로의 실제 인스턴스는 인수 또는 반환 값을 가질 수 있습니다.
, 조 감사합니다 :
세 가지 매크로 호출을 생성합니다. 내 행동을 설명하기 위해 매크로 '% PerformDoLoop'은 루프를 수행하는 메소드를 작성하는 것과 유사하지 않습니다. 말 그대로 루프 자체를 수행하는 것입니다. 다른 언어에서는 열린 코드에서 루프를 호출 할 수 있습니다. SAS에서는 그렇지 않습니다. 대신에 루프는'data _null_' 또는 매크로 - 멘드 - 호출 블록 내에서 위와 같이 싸여 야합니다. 실제로, 나의 BlackBox는 논쟁을합니다. 다른 인수에 대해 BlackBox를 호출해야하기 때문에 의사 배열 (pseudo-array)로 매크로 목록을 만들었습니다. 그런 다음 BlackBox는 배열을 사용하고 루프 인덱스를 사용하여 다른 인수를받습니다. –
@LoremIpsum 그렇다면 루프 매크로를 작성하지 않을 것입니다. 매개 변수의 매크로 목록을 작성하는 대신 BlackBox에 대한 호출의 매크로 목록을 작성하십시오. SAS가 개방 코드에서 루프를 갖지 않는 것이 특별히 독특하지 않다고 제안합니다. C에서 그렇게 할 수는 없습니다. 특히 명백한 예를 들면, 서브 루틴에 있어야합니다. SAS와 마찬가지로 코드 캡슐화가 시행 된 것입니다. 즉, SAS 9.5에서는 매크로 외부에서 매크로 흐름 제어 ('% do' 등)를 허용하는 것처럼 보이지만, 좋은 일이라고 확신하지는 않습니다. – Joe
흥미로운 점 9.5. 나는 SGF에서 열린 선언문이 9.5에오고 있다고 들었다. 그리고 나는 그것이 좋은 것임을 확신하지 않는다. 구현 방법에 대한 초기 기사를 보셨습니까? – Quentin