El lenguaje macro SAS ® potencia enormemente a los programadores SAS con versatilidad y eficiencia en el desarrollo de su código. Permite a los usuarios de SAS modularizar el código de programación con componentes» una vez escritos, utilizados muchas veces » y, en muchos casos, generar automáticamente código SAS basado en datos.
Entrada de blog relacionada: Función de macro multipropósito para obtener información sobre conjuntos de datos
Lenguaje de macro y procesador de macro
Generalmente, el software SAS procesa su programa SAS paso a paso, primero escaneándolo en busca de objetos de lenguaje de macro: variables de macro referenciadas como &somename y macros referenciadas como %somename. Si se encuentra, el software SAS activa el procesador de macros que resuelve y sustituye esas referencias de macros de acuerdo con la sintaxis del lenguaje de macros antes de que SAS compile y ejecute sus pasos de programación.
Lenguaje macro SAS vs. Lenguaje de programación SAS
Un programa SAS generalmente consta de dos capas, a menudo entrelazadas: capa macro y capa no macro, cada una con su propia sintaxis y su propio tiempo de compilación y ejecución. En otras palabras, el código SAS es una combinación de dos lenguajes distintos:
- lenguaje de programación SAS (compuesto por pasos de DATOS, pasos de PROC y declaraciones globales como LIBNAME, OPTIONS, TITLE, etc.)
- Lenguaje de macro SAS (compuesto por %LET, % IF, % DO, funciones de macro, etc.) que se procesa por separado y antes de que el compilador SAS ejecute el código del lenguaje de programación SAS.
La diferencia entre ellos es como una diferencia entre cocinar una comida y comerla. En esta analogía meal = code, cooking = lenguaje macro SAS,eating = lenguaje de programación SAS. Una comprensión clara de esta diferencia es la clave para convertirse en un programador SAS exitoso.
Dos tipos de macros SAS
Hay dos tipos distintos de macros SAS:
- Macros que generan código de lenguaje de programación SAS que puede abarcar instrucciones o pasos SAS;Macros
- que generan algunos valores de cadena que se pueden usar como parte del código de lenguaje de programación SAS o valores de datos, pero no son instrucciones o pasos SAS completos. Este tipo no genera ningún código ejecutable SAS, solo un valor.
¿Qué es una función macro SAS?
La función macro SAS es una macro SAS que genera un valor. En otras palabras, es la macro de tipo 2 descrita anteriormente. Como cualquier macros SAS, las funciones de macro SAS pueden tener cualquier número (cero o más) de parámetros posicionales y/o con nombre (argumentos). Los usuarios de SAS pueden definir sus propias funciones de macro, pero al hacerlo no puede utilizar ninguna sintaxis de lenguaje SAS; solo se permite la sintaxis de lenguaje de macro SAS. Puede utilizar funciones de macro existentes en su propia definición de función de macro. Entre otras, una de las más poderosas es la función macro %SYSFUNC, que trae una gran cantidad de funciones de lenguaje SAS al lenguaje macro SAS.
Fuentes de funciones macro SAS
Las funciones macro SAS pueden provenir de las tres fuentes siguientes.
Funciones de macro prediseñadas
Funciones de macro prediseñadas que forman parte del procesador de macro. Estas son funciones de macro como %eval, % length, %quote, %scan, %str, %sysfunc, %upcase, etc. Aquí hay una lista completa de las funciones de macro SAS preconstruidas.
Funciones de macro de llamada automática
Macros de llamada automática, algunas de ellas son de tipo 1 (macros) y otras de tipo 2 (funciones de macro), como %cmpres, %left, %lowcase, %trim, %verify, etc. Estas funciones macro complementan las funciones macro preconstruidas. La principal diferencia con las funciones de macro preconfiguradas es que las funciones de macro de llamada automática son muestras de programas de las funciones de macro definidas por el usuario que están escritas en lenguaje de macro SAS y que se ponen a su disposición sin tener que definirlas o incluirlas en sus programas. Las funciones de macro de llamada automática vienen con la instalación de su software SAS y, por lo general, están preconfiguradas para usted configurando las opciones del sistema MAUTOSOURCE y SASAUTOS= macro. Pueden incluir varias bibliotecas de macros en función de los productos SAS con licencia en su sitio. Por ejemplo, para la instalación de mi BASE SAS, la biblioteca de macro de llamada automática se encuentra en la siguiente carpeta:
C:\Program Files\SASHome\SASFoundation \ 9.4 \ core \ sasmacro
Aquí hay una lista seleccionada de macros de llamada automática provistas con el software SAS.
Desde el punto de vista del uso, no notará ninguna diferencia entre las funciones de macro preconstruidas y de llamada automática. Por ejemplo, la función macro %upcase() está preconstruida, mientras que la función macro %lowcase() es una función macro de llamada automática. Pertenecen a familias completamente diferentes, pero las usamos como si fueran hermanos complementarios.
Funciones de macro definidas por el usuario
Finalmente, hay funciones de macro definidas por el usuario que no vienen con la instalación de SAS. Estas son las funciones macro que define por su cuenta. Por lo general, se mantienen separadas de las macros de llamada automática, principalmente para distinguirlas de las suministradas por SAS.
Para habilitar el acceso a su propia biblioteca de macro SAS además de la biblioteca (o bibliotecas) de macro de llamada automática, puede usar la opción INSERT= system:
options insert=(sasautos= «path_to_your_own_macro_library_folder»);
En lugar de reemplazar el valor SASAUTOS, esta opción inserta un valor adicional en la opción SASAUTOS existente como primer valor, lo que le permite acceder primero a su propia biblioteca de macros y luego también a las bibliotecas de llamadas automáticas SAS predefinidas.
Crear una función macro definida por el usuario
Consideremos el siguiente ejemplo. Supongamos que queremos crear una función de macro que tome un nombre de conjunto de datos como argumento y devuelva un valor igual al número de observaciones en ese conjunto de datos.
Sabemos que el siguiente código calcula el número de observaciones en un conjunto de datos:
data _null_; call symputx('NOBS',n); stop; set SASHELP.CARS nobs = n; run; % put &=NOBS;NOBS=428
¿Podemos crear una función de macro SAS encerrando este código en macro? Algo como esto:
%macro nobs(dset=,result=); %global &result; data _null_; call symputx("&result",n); stop; set &dset nobs=n; ejecutar;%mend nobs;
La respuesta es «No». Sí, creamos una macro válida; podemos invocar esta macro para producir el resultado:
%nobs (dset = SASHELP.CARS, result = NOBS);%put &=NOBS; NOBS=428
Pero esta no es una función macro. ¿Recuerda la macro de tipo 2 que no genera ningún código de lenguaje de programación SAS, solo un valor? Pero esta macro genera código SAS que asigna un valor a la variable macro especificada como segundo argumento (result = NOBS).
Para crear una función de macro válida, nuestra macro no debe tener ningún código de lenguaje SAS, ni un paso de DATOS ni un paso de PROC. Solo puede estar compuesto por el código de lenguaje de macro SAS. Aquí está:
%macro nobs(dset); %local c n; %vamos dsid = %sysfunc(abierto(&dset)); %si &dsid %entonces %hacer; %vamos n = %sysfunc(attrn(&dsid,nlobs)); %vamos dsid = %sysfunc(cierre(&c)); %end; %else %puesto %sysfunc(sysmsg()); & n % mend nobs;
Cuando el procesador de macros ejecuta esta macro, el único objeto que se pasa al compilador de lenguaje SAS es el valor que se muestra en la línea justo antes de %mend. Este es el valor calculado del número de observaciones (denotado por & n). Esto es lo único que es visible por el compilador de lenguaje SAS, el resto es el código de lenguaje de macro visible y manejado por el procesador de macro SAS.
IMPORTANTE: Al definir la función de macro SAS, utilice siempre la instrucción % local para enumerar TODAS las variables de macro que se crean en su macro para asegurarse de que no sobrescriban accidentalmente las variables de macro con el mismo nombre en el entorno de llamada. No es necesario declarar %local para los parámetros de macro, ya que siempre son locales automáticamente.
Ejemplos de uso de funciones macro SAS
Cuando una función macro se define de esta manera, dondequiera que coloque su invocación %nobs(SASHELP.CARS) en su código SAS será evaluado y reemplazado por el valor correspondiente (en este caso es el número 428) por el procesador de macros SAS. De esta manera, puede evitar la codificación rígida deficiente y hacer que su código SAS sea dinámico y potente. Puede usar funciones de macro en muchos contextos de codificación SAS. Por ejemplo:
- Instrucciones de asignación para variable de macro: %let NOBS = % nobs (SASHELP.CARS);
- Instrucción de asignación en un paso de DATOS: x = % nobs (SASHELP.CARS);
- Como parte de una expresión en un paso de DATOS: x = %nobs(SASHELP.CARS) / 2 + 3;
- Como valor de un bucle de paso de datos do: do i=1 a % nobs (SASHELP.CARS);
- Como valor de un bucle do macro: %do & i = 1% a % nobs (SASHELP.CARS);
- Como parte de la condición en la instrucción IF: if %nobs (SASHELP.CARS) > 500 luego hazlo;
Y así sucesivamente. Es importante tener en cuenta que los argumentos (parámetros) de las funciones de macro deben ser constantes SAS o expresiones de macro que resuelvan constantes SAS. Dado que las funciones de macro son resueltas por el procesador de macro antes de la ejecución del programa SAS, los argumentos no pueden ser nombres de variables. Esta es la diferencia clave entre las funciones macro y las funciones SAS.
¿Tus pensamientos?
¿Te parece útil este post? ¿Utiliza funciones macro SAS? ¿Puede sugerir otros ejemplos de uso? Por favor, comparta con nosotros en los comentarios a continuación.