2013-12-19 3 views
2

Допустим, что я пытаюсь сделать следующее:SAS: Как передать переменные между операторами IML?

%macro test(a=); 
%do i=1 %to &a; 
    proc iml; 
     b=b//(2*i); 
    quit; 
%end; 

proc iml; 
    print sum(b); 
quit; 

%mend; 

%test(a=2); 

В коде я пытаюсь писать, я не могу поставить все это в одном IML (мне нужна ргос частота в пределах делать петли). Приведенный выше код дает ошибку «Матрица b не установлена ​​в значение». Как сообщить SAS, что такое b, чтобы я мог получить к нему доступ после того, как я покинул инструкцию iml?

ответ

0

Вам необходимо переделать вещи так, чтобы PROC IML; и QUIT; были вне макроса. Это хорошая практика большую часть времени даже в других сценариях, где это не так важно, но здесь это необходимо.

IE

%macro test(a=); 
%do i=1 %to &a; 
     b=b//(2*i); 
%end; 

proc iml; 
%test(a=5); 
quit; 

QUIT завершает сеанс PROC IML и очищает его память.

2

два предложения:

1) С помощью STORE statement, чтобы записать матрицу B на диск в конце первого вызова, а затем использовать LOAD statement, чтобы прочитать его в течение второго вызова:

store B; 
quit; 

proc freq data=...; 
run; 

proc iml; 
load B; 
... 

2) Альтернативный подход заключается в вызове PROC FREQ из вашей программы PROC IML с использованием SUBMIT and ENDSUBMIT statements:

/* compute B */ 
submit; 
proc freq data=...; 
run; 
endsubmit; 

s = sum(b): /* B is still in scope */ 
Смежные вопросы