2017-01-07 2 views
0

Можете ли вы помочь мне в этой ситуации? Я попытался передать несколько заголовков в массиве для макроса SAS для создания графиков. Я довольно новичок в программировании SAS, и я не могу понять, как это произошло. Большое спасибо за вашу помощь.Не удалось передать параметр SAS Macro

/*Create Trend Chart*/ 
%macro trendChart(dataFile,xVariable,yVariable,group); 
    proc gplot data=&dataFile; 
     plot &yVariable*&xVariable=&group; 
     symbol1 v=star c=blue; 
     title "Time Series Plot"; 
    run; 
    quit; 
%mend trendChart; 

data _null_; 
    /*Create Trend Chart*/ 
    Array variableList[*] Res_Rd1 OW_perp_Rd2; 
    do i=1 to dim(variableList); 
     var_name=vname(variableList[i]); 
     put var_name; 
     %trendChart(TDMR.Children,M_Date,var_name,t_); 
    end;  
run; 

enter image description here

+3

Возможный дубликат [Динамически называют макрос из с.а.с шага данных] (http://stackoverflow.com/questions/25545892/dynamically-call-macro-from-sas-data-step) – Reeza

+0

Посмотрите на DOSUBL или CALL EXECUTE для вызова макроса с шага данных. Я связан с аналогичным решением, в документах также есть примеры. – Reeza

ответ

1

Вы не можете ссылаться на значения ступенчатых данных переменных в макровызовов. Таким образом, в вашем вызове макроса значение VAR_NAME просто передается макросу как имя переменной для использования в PROC, который он генерирует.

Вы не можете вставлять шаги друг в друга. Когда выполняется вызов макроса, он генерирует код SAS, который затем компилируется и выполняется SAS. Когда SAS видит шаг PROC или DATA, он немедленно прекращает компиляцию текущего шага. Таким образом, ваш шаг данных будет иметь закрытый цикл DO, когда SAS видит инструкцию PROC, сгенерированную макросообщением.

Вы можете использовать новый макрос для генерации нескольких вызовов существующего макроса.

%macro run_charts(varlist); 
%local i ; 
%do i=1 %to %sysfunc(countw(&varlist)); 
    %trendChart(TDMR.Children,M_Date,%scan(&varlist,&i),t_); 
%end; 
%mend run_charts; 
%run_charts(Res_Rd1 OW_perp_Rd2); 

Если вы хотите использовать шаг DATA вместо затем использовать ВЫЗОВ EXECUTE(), чтобы раздвинуть макро-вызовов на стек для запуска после этапа данных заканчивается. На шаге данных, если вы хотите перебрать список значений константы строки, вы можете перечислить его в инструкции DO. Не нужно создавать массив имен фиктивных переменных.

data _null_; 
    length var_name $32 ; 
    do var_name='Res_Rd1','OW_perp_Rd2'; 
    call execute('%nrstr(%trendChart)(TDMR.Children,M_Date,' 
     ||var_name ||',t_);' 
    ); 
    end; 
run; 
+0

Это немного отличается, поскольку речь идет о переходе по списку имен, а не к значениям из набора данных. – Tom