loops - Bucle sobre los nombres en SAS-IML?
(2)
La forma más fácil que se me ocurre para hacer esto es usar alguna sintaxis que no sea IML. PROC SQL, por ejemplo, puede generar listas de variables macro.
%let stem=class_;
data class_s1 class_s2;
set sashelp.class;
run;
data suffices;
input suffix $;
datalines;
s1
s2
;;;;
run;
%macro use_suffix(suffix=);
use &stem.&suffix.;
read all into &stem.&suffix.;
print &stem.&suffix.;
%mend use_suffix;
proc sql;
select cats(''%use_suffix(suffix='',suffix,'')'') into :suffixlist separated by '' '' from suffices;
quit;
proc iml;
&suffixlist;
quit;
¿Cómo puedo leer un SAS-Dataset con un nombre dado como raíz + sufijo en IML? La raíz se da como una macrovariable SAS, lo suficiente que pretendo usar están en un vector de cadena en IML.
En RI usaría
suffix<-c(''s1'',''s2'')
for (s in suffix){
data<-eval(as.name(paste(stem,s,sep='''')))
}
Podría hacer el bucle si tuviera el código para el primer conjunto de datos. Lo intenté:
proc iml;
suffices = {''s1'',''s2''};
call symput(''suffix'',suffices[1]);
use &stem.&suffix.;
El problema es que si en un do-loop (y lo necesito como bucle sobre los nombres), call symput realmente no funciona. Aquí encontré el símbolo, pero en el contexto de uso & stem.symget (''sufijo'') no fue fructífero.
¿Alguna otra idea?
Editar: Encontré la siguiente solución bastante poco elegante:
proc iml;
%global suff;
suffix={''s1'',''s2'',''s3''};
%do ii = 1 %to 3;
call symput(''suff'',suffix[&ii.]);
<do stuff based on the suffix>
%end;
Aún así, no creo que esta sea la manera en que se supone que uno debe trabajar en ello.
Si tiene SAS / IML 12.1, simplemente use la concatenación de cadenas para construir el nombre del conjunto de datos y luego coloque paréntesis alrededor del nombre, como se describe en la publicación del blog " Leer conjuntos de datos que se especifican en una matriz ".
Tenga cuidado cuando intente usar variables macro en un bucle. Vea los consejos en el artículo " Macros y bucles en el lenguaje SAS / IML "