2013-06-06 4 views
0

SAS를 처음 사용하고 나중 PROC GPLOT에 대한 y 축 값을 만드는 매크로 프로 시저를 만들고 싶습니다.SAS 매크로 if then else

일반 영어의 경우이 그래프에는 두 가지 가능한 최소값 (및 최대 값)이 있습니다. 축 범위는 최소값이 가장 작은 값에 따라 다릅니다. 그렇지 않으면 SAS는 축 범위 밖에 데이터를 표시하지 않습니다. SAS가 자동으로 범위를 생성하는 것을 원치 않습니다. 내가 직접 범위를 정의하고 싶습니다.

그래서 이것은 a) 두 개의 최소값을 계산하고, b) 두 개를 비교하고, c) 두 개 중 작은 것을 새로운 매크로 변수에 저장하는 시도입니다. 이 프로그램을 작동 시키면 최대 절차가 쉽게 수행 될 수 있습니다.

%MACRO min; 
%LET ymin1 = %SYSEVALF(&minresult - (((&minresult + &maxresult)/2) * .05); 
%PUT ymin1 = &ymin1; 
%LET ymin2 = %SYSEVALF(&min - (&min * .05)); 
%PUT ymin2 = &ymin2; 
%IF &ymin1 > &ymin2 
%THEN %LET ymin = ymin2; 
%ELSE %LET ymin = ymin1; 
%PUT ymin = &ymin; 
%MEND min; 

나는 내가 잘못 구문 뭔가를하고있는 중이 야 느낌이 듭니다. 어떤 도움을 주셔서 감사합니다.

%let ymin = %sysfunc(min(&ymin1,&ymin2)); 

첫 Ymin를 선언에서) 누락 된 이외의 당신이 특정 구문 오류가 있다는 것입니다 : 물건을 그냥 ymin1/2에서 Ymin를 정의하면

+0

몇 가지 참고 사항 - 매크로 절차 같은 건 없다; '매크로'는 용어 자체입니다. 'PROC FCMP'는 함수와 프로 시저를 만들 수있게 해주지 만 매크로 언어가 아니라 데이터 단계 언어에 가깝습니다. 또한 매크로 매개 변수로 & min/& minresult/& max/& maxresult를 정의해야합니다. 매크로 매크로 변수로 존재하더라도, 다시 스타일을 정의하는 것이 좋습니다. 여전히 % 분 (& min, & max, & minresult, & maxresult)을 호출 할 수 있으며 정상적으로 작동합니다. – Joe

답변

2

간단한 해결책은 %를 생략하는 것입니다 %let ymin = ymin2;%let ymin=&ymin2;이어야합니다. 그렇지 않으면 매크로 변수의 내용이 아닌 텍스트 "ymin2"만 포함합니다.

전체 매크로 :

%MACRO min(minresult,maxresult,min,max); 
%LET ymin1 = %SYSEVALF(&minresult - (((&minresult + &maxresult)/2) * .05)); 
%PUT ymin1 = &ymin1; 
%LET ymin2 = %SYSEVALF(&min - (&min * .05)); 
%PUT ymin2 = &ymin2; 
%let ymin = %sysfunc(min(&ymin1,&ymin2)); 
%PUT ymin = &ymin; 
%MEND min; 

%min (5,6,3,4); 
+0

이 경우 % sysfunc가 호출하는 min()은 SAS min 함수이며 이름 및 용도 이외의 방법으로 매크로와 관련이 없습니다. ymin1/ymin2가 정의되어 있거나 sysfunc 호출에서 생성 된 경우 공개 코드에서이를 실행할 수도 있습니다. SYSEVALF를 사용했다면 SYSEVALF를 사용할 필요가 없습니다. – Joe

+0

당신은 % sysfunc가 이것을 훨씬 쉽게 만들어줍니다. 그러나 이제는 "오류 : 오픈 코드 문 재귀가 감지되었습니다."라는 메시지가 나타납니다. –

+0

절차를 다시 작성할 수 있습니까? –