2011-03-25 16 views
6

En general, ¿cómo manejamos la situación donde las variables macro necesitan ser modificadas dentro de una macro; Por ejemplo, supongamos que tengo esta macro:Variable de macro SAS cambio

%macro test (arg=); 
array arrayone [&arg]; /* This is ok */ 
array arraytwo [&arg+1] /* This is not ok. How to make it work? */ 
... 

¿Cómo manejamos estas situaciones cuando quiero prueba% (3) y luego el arraytwo tiene que tomar la dimensión 4 ...?

Respuesta

5

cambiarlo a

array arraytwo[%EVAL(&ARG + 1)] ;

3

Usando% eval es suficiente, siempre y cuando sólo se requiere la aritmética de enteros. Si necesita realizar una aritmética de coma flotante con variables macro, debe usar% sysevalf en su lugar.

La mayoría de las funciones escalonadas de datos se pueden aplicar directamente a las variables macro a través de uno de dos métodos:

1. %function() 
2. %sysfunc(function()) 

Para muchas de las funciones más utilizadas, hay equivalentes macro exactas, y todo lo que tiene que hacer es agregue un% al frente del nombre de la función. Las funciones que no tienen macroequivalentes exactos generalmente se pueden hacer para aceptar una variable de macro llamándolas dentro de% sysfunc(). N.B. funciones de paso de datos que normalmente esperan que una cadena envuelta en comillas simples falle cuando se llama en un fragmento de código de macro a través de% sysfunc() a menos que elimine las comillas. P.ej.

data _null_; 
    x = rand('uniform'); 
run; 

funciona bien en un paso de datos, sino para dar una variable macro el mismo valor en un trozo de código de macro, que tendría que utilizar

%let x = %sysfunc(rand(uniform)); 

Esto se debe a que en el entorno macro, SAS interpreta el texto uniforme como una cadena, mientras que en un paso de datos SAS interpretaría el texto sin comillas como el nombre de una variable.