BookmarkSubscribeRSS Feed
Tip Semanal 037: Funciones macro (parte 2)
Berenice25
SAS Employee

Este Tip es la segunda parte de las funciones macro de SAS. 
En la primera parte vimos ejemplos de algunas funciones elementales. Ahora veremos algunas funciones más "avanzadas". 
Como siempre, hay que recordar que las funciones macro trabajan sobre el texto de un programa (operan antes de que un programa se compile, tal como lo hacen las variables macro). Por esto siempre resuelven texto. 
Antes de compilar... solamente texto... cuántas limitaciones. Bueno, ¡al menos por ahora!

Pueden encontrar información adicional en: 
https://documentation.sas.com/doc/en/pgmsascdc/v_037/allprodsle/syntaxByType-macroFunction.htm#n16pt...

 

*****************************************
* 							  			*
* 	Funciones macro (segunda parte)		*
* 							  			*
****************************************;

/* Antes de comenzar, vamos a utilizar la opción symbolgen para ver cómo 	*/
/* resuelven las variables macro. 											*/
options symbolgen; 

/* Y no hay que olvidar que el resultado de %put ¡se ve en el Log!		 	*/

/* Ahora sí podemos continuar... */

/* Ya sabemos que las variables macro siempre guardan texto. No nos pueden 	*/
/* engañar con algo como:													*/
/*
%let x = 3+4;
*/
/* y que que nosotros ingenuamente digamos que x es igual a 7. Sabemos que 	*/
/* guarda '3+4' (¡sin las comillas!)										*/

/* Pero, ¿y si es necesario resolver esta operación?						*/
/* Veamos el siguiente ejemplo. 											*/


/*----------------------*/
/* Ejemplo 1: 	 		*/
/* Función %EVAL 		*/
/*----------------------*/

/* La función %eval resuelve expresiones aritméticas enteras o lógicas.	*/
/* Como es de suponer, al trabajar con expresiones enteras no se pueden	*/
/* utilizar decimales.													*/
/* Y los resultados siempre serán enteros.								*/


/* Creo 4 variables macro que incluyan operaciones aritméticas */
%let v = 3+4;
%let x = 3-4;
%let y = 3*4;
%let z = 3/4;

/* Utilizo la función macro %eval */
data uso_eval;
	resuelve_v=%eval(&v);
	resuelve_x=%eval(&x);
	resuelve_y=%eval(&y);  
	resuelve_z=%eval(&z);  /* ¡no puede incluir decimales! */
run;

/* Podemos ver que las 3 primeras variables dan un resultado correcto, pero la
variable 'resuelve_z' tiene un error. ¿Por qué? Justamente por el problema de los
decimales */

/* No hay que olvidar que %eval no trabaja con decimales o missings */
/* Por ejemplo, el siguiente código da error */
%let a = 3*4.0;
%let b = 3+.;
%let resuelve_a=%eval(&a);
%let resuelve_b=%eval(&b);
%put la variable macro &a es igual a  &resuelve_a;
%put la variable macro &b es igual a  &resuelve_b;


/* ¿Cómo podemos resolver esto? */
/* ¡Con la función %SYSEVALF! */



/*----------------------*/
/* Ejemplo 2: 	 		*/
/* Función %SYSEVALF	*/
/*----------------------*/

/* Esta función macro evalúa expresiones aritméticas y también lógicas (como lo	*/
/* hace %eval). Pero en vez de usar aritmética entera utiliza 'punto flotante', */
/* lo que le permite operar con decimales y con missings. 						*/

%let a = 3*4.0;
%let b = 3+.; /* con un missing */
%let c = 3/4;

data uso_sysevalf;
	resuelve_v=%sysevalf(&a);
	resuelve_x=%sysevalf(&b);
	resuelve_y=%sysevalf(&c);
run;



/*----------------------*/
/* Ejemplo 3: 	 		*/
/* Función %STR 		*/
/*----------------------*/

/* La función %str enmascara varios símbolos, entre ellos el punto y coma */

%let sin_str = data str; x=1; y=2; run; ;  /* lee el primer punto y coma y lo demás 
											no forma parte de la variable macro */
%put La variable macro sin_str es igual a: &sin_str;

%let con_str = %str(data str; x=1; y=2; run;) ; /* %str enmascara los puntos y comas */
%put La variable macro con_str es igual a: &con_str;


/* Además, la función %str preserva espacios al principio y al final.	*/
/* Veamos el siguiente ejemplo: 										*/

/* Recordar que las variables macro eliminan espacios al principio y al final. */
%let texto =     ¿5 espacios antes y después?     ;
%put El resultado entre signos de exclamación: !&texto!;

/* Uso la función macro str para conservar espacios en blanco al principio y al 
final. */
%let texto_str =%str(     ¿5 espacios antes y después?     );
%put El resultado entre signos de exclamación: !&texto_str!;




/*----------------------*/
/* Ejemplo 4: 	 		*/
/* Función %NRSTR 		*/
/*----------------------*/

/* La función %nrstr hace lo mismo que %str, pero además enmascara los % y los & */

/* La función str no enmascara el símbolo de '&'. %nrstr sí lo hace */
%let texto_ampersand = Latinoamérica Tech &cía.; /*va a buscar la variable macro y 
														no la va a encontrar*/
%let texto_ampersand_str = %str(Latinoamérica Tech &cía.); /*también va a buscar la 
															variable macro y no la va 
															a encontrar*/
%let texto_ampersand_nrstr = %nrstr(Latinoamérica Tech &cía.); /*nrstr enmascara
																el símbolo de '&' (o 'y')*/
%put La variable macro texto_ampersand es igual a: &texto_ampersand;
%put La variable macro texto_ampersand_str es igual a: &texto_ampersand_str;
%put La variable macro texto_ampersand_nrstr es igual a: &texto_ampersand_nrstr;


/* La función str no enmascara el símbolo de porcentaje. Es necesario usar la
función nrstr */
%let texto_porcentaje = el 6%de inflación es demasiado; /*va a buscar la macro 'de' y 
														no la va a encontrar*/
%let texto_porcentaje_str = %str(el 6%de inflación es demasiado); /*también va a 
																buscar la macro 'de' y
																no la va a encontrar*/
%let texto_porcentaje_nrstr = %nrstr(el 6%de inflación es demasiado); /*nrstr enmascara
																	 el símbolo de porcentaje*/
%put La variable macro texto_porcentaje es igual a: &texto_porcentaje; 
%put La variable macro texto_porcentaje_str es igual a: &texto_porcentaje_str;
%put La variable macro texto_porcentaje_nrstr es igual a: &texto_porcentaje_nrstr;



/*----------------------*/
/* Ejemplo 5: 	 		*/
/* Función %SYMDEL 		*/
/*----------------------*/

/* La función macro symdel se utiliza para borrar variables macro */

/* En este ejemplo se están eliminando 3 variables macro */
%symdel texto_porcentaje texto_porcentaje_str texto_porcentaje_nrstr;




/*-------------------*/
/* fin del código 	 */
/*-------------------*/




Catch up on SAS Innovate 2026

Dive into keynotes, announcements and breakthroughs on demand.

Explore Now →
Article Labels
Contributors