Voy a presentaros la versión Beta de la macro de SAS que genera data.frames a partir de una tabla SAS en Windows; la versión en Linux me la ahorraré hasta el día que pueda instalar SAS en mi máquina virtual. La macro la iré mejorando y evolucionando; probablemente estas mejoras no las colgaré y no retomaré el hilo hasta que tenga una V1. El tema es sencillo y anteriormente ya hice mención a este método, pero ahora doy una vuelta de tuerca y directamente creamos data.frames a partir de datasets. Os pongo el total del código y comentaré los pasos más interesantes; por supuesto, es mejorable. Lo que no puedo asegurar es si funciona bajo WPS porque no me han renovado la licencia. Todo el código seguido:
%macro SASaR(datos, directorio, nombre);
* MODIFICAMOS EL NOMBRE Y EL DIRECTORIO PARA R;
%let nombre_r = &nombre..Rdata;
%let directorio_r = %sysfunc(tranwrd(&directorio., \, /));
* EXPORTACION A CSV DEL DATASET;
proc export data=&datos.
outfile="&directorio_r./elimina.csv"
dbms=csv replace;
putnames=yes;
run;
* CREAMOS UN PROGRAMA EN R QUE LEE EL CSV GENERADO Y LUEGO LO GUARDA;
filename pgm "&directorio_r./pgm.R";
* ESTABLECEMOS EL DIRECTORIO, LEEMOS Y GUARDAMOS;
data _null_;
file pgm;
put "setwd('&directorio_r.')";
put "df <- read.csv('elimina.csv')";
put "save(df, file='&nombre_r.')";
run;
* CREAMOS UN EJECUTABLE DE WINDOWS QUE ABRE R Y EJECUTA LA LECTURA DEL DATA FRAME;
filename open "&directorio./ejecucion.bat";
data _null_;
file open;
put '"C:/Program Files/R/R-x.x.x/bin/R.exe"' @@; * MODIFICAR RUTA SEGUN VERSION;
put ' CMD BATCH --no-save "' @@;
put "&directorio_r./pgm.R" @@;
put '"';
run;
* EJECUTAMOS EL BAT DE WINDOWS;
options noxwait xsync;
x "cd %quote(&directorio.)";
x "ejecucion.bat";
* ELIMINAMOS LOS ARCHIVOS TEMPORALES;
x "del elimina.csv";
x "del pgm.R";
x "del ejecucion.bat";
* VEMOS EL RESULTADO DE LA IMPORTACION;
proc fslist fileref="&directorio.\pgm.Rout";
run;
%mend SASaR;
* EJEMPLO DE USO;
%SASaR(sashelp.shoes, C:\temp\pruebas_proceso, df1);
Ahí tenéis la macro que genera el script de Windows. Analizamos lo más interesante paso a paso:
Modificación de nombres y directorios:
%let nombre_r = &nombre..Rdata;
%let directorio_r = %sysfunc(tranwrd(&directorio., \, /));
Un pequeño cambio a los nombres para evitar problemas con R y los directorios con barras invertidas (\).
Exportación a CSV: Exportamos el conjunto de datos SAS a CSV, un fichero temporal que posteriormente borraremos.
Programa en R:
El programa R realiza un read.csv del temporal y guarda un objeto de R con el nombre que especificamos.
Llamada a R en modo batch:
Creamos un archivo .bat que ejecuta R con la opción --no-save para que no guarde cambios globales (ya guardamos nosotros con save()). En este punto, cada uno tendrá instalado R en distintos directorios; tendréis que modificar a mano la ruta al ejecutable R.exe.
Ejecución y limpieza:
Para evitar problemas, las opciones de sistema operativo que recomiendo son noxwait y xsync, para que se ejecuten las sentencias X una a una y no de golpe. Por último, vemos el fichero de resultados de R (.Rout) con el PROC FSLIST; así podremos analizar los resultados obtenidos.
Creo que desgranando la macro todo queda más sencillo de comprender. Ahora ya podréis aprovechar R con SAS o SAS con R; eso no me queda tan claro aún. Saludos.