2016-04-07 2 views
2

Я пытаюсь использовать макрос для обозначения некоторых переменных массива в SAS, чтобы избежать необходимости вводить много строк кода. То, что я пытаюсь сделать, это в основном это:SAS: array, переданный макросу

%macro LABEL_ARRAY(V); 
%DO I = 1 %TO 4; 
    %let variablename=&V(&I); 
    array1[&I] = "Value of &variablename" 
%END 
%MEND LABEL_ARRAY; 

Таким образом, V представляет собой массив, содержащий соответствующие имена переменных для позиций в array1 массива. Я пытаюсь сделать это для более чем 4 переменных для каждого массива и для множества массивов, но это основная идея. В основном то, что происходит, это массив1 [& I], который я бы хотел в конце сказать сказать array1 [1] для первой записи, не использует значение I, а просто говорит & I, то же самое с & variablename.

Любые предложения о том, что может произойти? Благодарю.

+0

вы можете попробовать% let variablename = & &V(&I);, чтобы узнать, будет ли это работать, но я подозреваю, что нет. Фактически измените его на:% let variablename = &&V&I;, и это должно работать – DCR

+0

Я смущен относительно того, что вы хотите. Можете ли вы показать шаг данных, который использует ваш макрос? Вы говорите, что хотите отмечать переменные, но нет инструкции LABEL. Array1 [& i] решит array1 [1], как вы говорите, вы хотите. & Variablename не будет разрешать имя переменной. Вы можете посмотреть функцию VNAME. Но вы не можете использовать массив шагов данных, чтобы назначать метки переменных. – Quentin

+0

@Quentin Предположительно это создает кучу операторов ярлыков, которые затем используются как 'label% label_array (v);' – Joe

ответ

2

В языке макросов нет встроенного массива (на языке макросов вообще нет типов) в SAS.

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

Однако для конкретного случая макропеременной «массивы» стоит объяснить, как именно они работают.

То, что вы, скорее всего, набор макропеременными следующим образом:

%let v = Color; 
%let color1=Blue; 
%let color2=Red; 
%let color3=Green; 

И вы хотите, чтобы быть в состоянии сделать:

%do _i = 1 to 3; 
    %let thisColor = &color&_i; 
%end; 

Кроме того, что не работает - потому что &color рассасывается (и, вероятно, разрешается до &color, если вы не указали отдельно taht), и &i разрешает 1, оставив вас с &color1, но не Blue, а также предупреждающее сообщение о &color не разрешается.

Что вам нужно сделать, это задержать разрешение &color до &_i. Вы можете сделать это, добавив второй амперсанд.

%do _i = 1 to 3; 
    %let thisColor = &&color&_i; 
%end; 

Что это делает говорит SAS для того чтобы разрешить два && одному &, но держать его в очереди для разрешения; затем на втором проходе разрешите этот одиночный &. Итак, у вас есть

&&color&_i 
&color1 
Blue 

Вместо остановки на втором уровне.

Это объясняется более подробно в моей статье Unravelling the Knot of Ampersands и Ron Fehd's Array: Construction and Usage of Arrays of Macro Variables.

+0

В дополнение к этому я бы посоветовал вам рассмотреть альтернативы массиву макропеременных, поскольку часто бывает проще делать такие вещи с помощью программирования, управляемого данными (для Google SAS +). – Joe

+0

Вау, спасибо, @ Джо, это все очень полезно! – kyro1021

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