2015-11-25 3 views
2

Итак, я создал макрос, который отлично работает. Внутри макроса я установил, где начнется наблюдение, а затем сколько наблюдений он прочитает.Упрощение определения макроса

Но, на мой Proc вызов печати, я не могу просто сделать:

(firstobs=&start obs=&obs) 

Потому что, хотя firstobs будет правильно начать, где я хочу, набл не сотрудничает, как это должно быть большее число чем firstobs. Например,

%testmacro(start=5, obs=3) 

не работает, потому что он читает в первых 3 наблюдениях, но при попытке начать с наблюдения 5. То, что я хочу макрос, чтобы сделать это, начните с наблюдения 5, а затем читать следующий 3. Так что я сделал вот так:

(firstobs=&start obs=%eval((&obs-1)+&start)) 

Это прекрасно работает, когда я его использую. Но мне просто интересно, есть ли более простой способ сделать это, вместо того, чтобы использовать весь вызов% eval .... Есть один простой вызов, что-то вроде numberofobservations = ...?

ответ

3

не думаю есть. Вы можете немного упростить свой макрос, в пределах% eval(). ,

%let start=5; 
%let obs=3; 

data want; 
set sashelp.class (firstobs=&start obs=%eval(&obs-1+&start)); 
run; 

Варианты набора данных перечислены здесь: http://support.sas.com/documentation/cdl/en/ledsoptsref/68025/HTML/default/viewer.htm#p0h5nwbig8mobbn1u0dwtdo0c0a0.htm

Можно считать набл внутри шага данных с помощью счетчика и только выводить записи желательно, но это не будет работать на что-то вроде Proc печати и не эффективен для больших этапов данных.

Вы можете попробовать параметр point =, но я не знаком с этим методом, и снова я не думаю, что он будет работать с proc print.

1

Как сказал @Reeza - нет опции набора данных, которая будет делать то, что вы ищете. К сожалению, вам нужно рассчитать окончательное наблюдение, и %eval() - это хороший способ сделать это как любой.

На боковой ноте я бы рекомендовал сделать ваш параметр макроса более гибким. Вместо этого:

%testmacro(start=5, obs=3) 

Изменить это взять один параметр, который будет представлен список опций набора данных для применения:

%macro testmacro(iDsOptions); 
    data want; 
    set sashelp.class (&iDsOptions); 
    run; 
%mend; 

%testmacro(firstobs=3 obs=7); 

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

+2

Согласитесь, это полезная гибкость, поэтому пользователь может добавить WHERE = или RENAME = и т. Д. Другой вариант - иметь параметр DATA и разрешать пользователю указывать в нем любые параметры. Поэтому вызывается так: '% testmacro (data = sashelp.class (firstobs = 3 obs = 7))'. Для меня это наиболее похоже на то, как пользователи используются для передачи наборов данных на шаги DATA или PROC. – Quentin

+0

@Quentin Yup, это определенно отличный подход. –

+0

Хм, вы могли бы подумать, что есть набор данных, который прост. Подход, о котором вы говорили, замечательно, я попробую. – coderX

Смежные вопросы