2017-05-08 35 views
0

我想解析從數據步到gplot過程的值,以使用調用symput函數向圖中添加一些統計量。但似乎只有最後一次觀察已經傳遞給gplot。我該如何解決這個問題?謝謝。爲什麼不能從數據步驟中解析值來逐步執行步驟?

libname out "c:\sas output"; 
%global ID; 
%global RSQ; 
%global RMSE; 

%macro plot(in=,id=); 
    axis1; 
    axis2 label=(angle=90 justify=center); 
    symbol1 value=dot c=bib h=15pt i=rl; 
    symbol2 value=dot c=red h=15pt i=rl; 
    legend1 position=(outside center bottom) frame label=("Blade ID" font=arial height=15pt) ; 
    proc gplot data=∈ 
     title1 "Correlation of &id &RSQ &RMSE"; 
     plot ser*ttmcw_nm/ grid legend=legend1 haxis=axis1 vaxis=axis2 annotate=reg; 
     where Blade_ID="&id"; 
    run; 
%mend; 

data _null_; 
    set reg; 
    call symput('ID',Blade_ID); 
    call symput('RSQ',_RSQ_); 
    call symput('RMSE',_RMSE_); 
    %put &ID; 
    %plot(in=out.bladeraw,id=&ID); 
run; 

輸入圖像的描述在這裏 enter image description here

回答

1
  1. 關於你的代碼

注:這裏是SAS documentation (Chapters 2,4)有關SAS代碼是如何處理 一步一步。

%put %plot和開始

行由宏處理器解決只有一次,獨立地選自數據步驟循環。要打印所有的&ID.值進行記錄,您可以使用

par = symget('ID'); 
put par; 

改爲。在循環中運行%plot你可以把它在宏語言循環,見點2

  • 建議代碼重建

    %macro generate_plots();

    %let vars=; 
    proc sql noprint; 
        select Blade_ID into :vars separated by '#' from reg; 
    quit; 
    %put &vars.; 
    
    %let i = 1; 
    %let var = %scan(%BQUOTE(&vars.), &i., %BQUOTE(#)); 
    %do %while(&var. ne); 
        %plot(in=out.bladeraw, id=&var.); 
        %let i = %eval(&i. + 1); 
        %let var = %scan(%BQUOTE(&vars.), &i., %BQUOTE(#)); 
        %put &var.; 
    %end; 
    

    %mend; %generate_plots();