Peter Kellberg Rundt om Danmarks Statistiks makroer Design, Standardisering, Teknik SAS Forum 2009
Ét makrobibliotek ca 50 makroer, vi selv har lavet mange andre fx CLAN Autocall makroer en makro er et SAS-program begge med samme navn Nemt at administrere
Ét makrobibliotek
SASAUTOS er 3 ting en SAS Environment variabel som er defineret i CFG-filen et FILEREF (FILENAME) som initialt har foldere fra SAS E V en OPTION hvor man kan bruge SASAUTOS default fileref (filename).
Hvorfor lave en makro? Har vi en makro, der...? dække et behov (reaktivt eller proaktivt) Er det svært/besværligt at lave i SAS-kode? Ja! Bliver tingene gjort mere rigtigt så? ja!
Bordet fanger En nyttig og god makro indgår hurtigt i produktionen! Så er det måske ikke så nemt lige at ændre væsentligt på funktionaliteten Find nogle at sparre med under udviklingen aftest, aftest, aftest... helst af andre Feedback? hører man intet, er det som oftest et godt tegn!
Et billede på at lave en makro Selve opgaven Triviel Fejlsøgning Tjek af forudsætninger Udfyldte parametre? Navnestandarder Findes libref? Findes SASdatasæt? Findes variabler? Findes en Windows-mappe? osv
DST_MERGE makroen, join af data Triviel Fejlsøgning Tjek af forudsætninger 600 linjer Selve opgaven 60 linjer
DST_MERGE makroen LEFT RIGHT ONLYLEFT MATCH ONLYRIGHT
DST_MERGE makroen 4316 %dst_merge(left=minedata.navne, 4317 right=minedata.loen, 4318 leftkey=pnr, 4319 rightkey=pnr, 4320 match=salgsoplysninger, 4321 onlyleft=personer_uden_salg, 4322 onlyright=ukendte_personer); -------------- Her kommer resultatet af parringen -------------- NOTE: There were 11 observations read from the data set MINEDATA.NAVNE. NOTE: There were 23 observations read from the data set MINEDATA.LOEN. NOTE: The data set WORK.SALGSOPLYSNINGER has 19 observations and 4 variables. NOTE: The data set WORK.PERSONER_UDEN_SALG has 1 observations and 4 variables. NOTE: The data set WORK.UKENDTE_PERSONER has 4 observations and 4 variables. NOTE: DATA statement used (Total process time): real time 0.34 seconds cpu time 0.03 seconds -----------------------------------------------------------------
DST_MERGE makroens features Nøgler behøver ikke hedde det samme Man kan selv angive et fælles navn til output datasæt Stille krav om et 100% match Man kan keepe/droppe variabler fra LEFT og RIGHT Variabler med samme navn i LEFT og RIGHT bliver suffixet med hhv _LEFT og _RIGHT så begge kommer med
Almen praksis Slank loggen Meddelelser: options nonotes nosource;...... options notes source; %put ERROR: Du skal angive...; %put WARNING: Følgende variabler..; %put NOTE: Der blev fundet &count datasæt, som...; Giv signal om, at makroen er kørt
Fejlsøgning, %RETURN %if &left= %then %do; %put; %put ERROR: Angiv navnet på et datasæt (LEFT=).; %put; options notes source; %return; %end;... %if &left= %then %do; %put; %put ERROR: Angiv navnet på et datasæt (LEFT=).; %put; %goto slut; %end;... %slut: options notes source; %mend;
Fejlsøgning %macro erblank(arg); %sysevalf(%superq(arg)=,boolean) %mend; %if %erblank(cprnummer) %then...; Paper 022-2009 IS THIS MACRO PARAMETER BLANK? Chang Y. Chung, Princeton University, Princeton, NJ John King, Ouachita Clinical Data Services, Mount Ida, AR
Fejlsøgning, %RETURN %* -------- ikke flere formelle fejl mv. --------;
Almen praksis Vi bruger næsten konsekvent KEYWORD-parametre Alle nye makro-variabler: gøres lokale med %LOCAL. husk at få i med i %do i=1 %to &Antal_Variabler... parametre er altid lokale Ryd op slet arbejds-datasæt, kataloger osv Hvis man ændrer vitale options, så husk, hvad de var sat til ændr tilbage igen
Restore af options, PROC OPTSAVE, OPTLOAD proc optsave out=_saved_options_; run;
Restore af options, PROC OPTSAVE, OPTLOAD proc optload data=_saved_options_; run;
Restore af options, PROC OPTSAVE, OPTLOAD proc optsave out=_saved_options_1; run; proc optload data=_saved_options_1; run; proc optsave out=_saved_options_2; run; proc compare data=_saved_options_1 compare=_saved_options_2; run;
Restore af options, GETOPTION %let old_pagesize=%sysfunc(getoption(pagesize,keyword)); PAGESIZE=55 options &old_pagesize; Andre muligheder sashelp.voption sashelp.vgopt dictionary.options dictionary.goptions
Indbygget dokumentation? 109 %dst_listdata(?) --- Hjælp til DST_LISTDATA -------------------------- Anvendelse: Lister data i et SAS-datasæt. Parametre : DATA= navn på et SAS-datasæt Eksempel : %dst_listdata(data=sashelp.class); -----------------------------------------------------
Indbygget dokumentation? %macro dst_listdata(help,data=); %if &help=? %then %do; %put; %put --- Hjælp til DST_LISTDATA --------------------------; %put Anvendelse: Lister data i et SAS-datasæt.; %put; %put Parametre : DATA= navn på et SAS-datasæt; %put; %put Eksempel : %nrstr(%dst_listdata(data=sashelp.class);); %put -----------------------------------------------------; %put; %return; %end; proc print data=&data; run; %mend;
Sådan har vi gjort det -register "SAS-støttens hjemmeside" "C:\Progra~1\Intern~1\iexplore.exe \\...\index.htm" -NOXSYNC /* Systemkommandoer kører asynkront med SAS */
Sådan har vi gjort det
Sådan har vi gjort det
På strejftur SUGI 30: Paper 060-30 HOW OLD AM I? ALDER Deb Cassidy beregner alder mellem to datoer int((intck('month',&startdato,&slutdato)-(day(&startdato)>day(&slutdato)))/12); CPRCHECK tjek cprnummer og afleverer alder og køn afleverer DATA-step kode Oplagte kandidater til SAS 9.2 Funktioner
På strejftur i makroerne DANFORMAT Danner et format ud fra et SAS-datasæt multilabel, hvis data er til det Numerisk eller Tekst format alt efter kodevariabel DELETE_GLOBALS (%SYMDEL, CALL SYMDEL) sletter samtlige globale makro-variabler DST_EXPORT2XLS SAS-data til Excel labels i stedet for variabelnavne formaterede værdier SASHELP.VCFORMAT brugerderfinerede formater
På strejftur i makroerne FJERNDUBLETTER Fjerner identiske observationer i et SAS-datasæt NB! NODUPREC i PROC SORT virker kun, hvis samtlige variabler figurerer i BY-sætningen. LOGSUMMARY kan kaldes til slut i et program giver en status over ting at være obs på fx 0 obs, 0 vars variable xxx is uninitialized
På strejftur i makroerne ORACLE2SAS Danner et SAS-datasæt ud fra en Oracle-tabel Oracle DATEs bliver til SAS DATEs Mulighed for at få KOLONNE COMMENTS med som labels SLETARK Sletter en fane i et Excel regneark Også hvis der er en formel Laver et VBScript, som eksekveres
På strejftur i makroerne VALIDSASDATASETNAME Tjekker om et navn på et SAS-datasæt er gyldigt (kalder VALIDSASNAME) findes (kalder DATASETEXIST variant) %if not %validsasdatasetname(&data) %then %do; %put ERROR: Fejl i datasætnavn, &validation_msg; %return; %end; ERROR: Fejl i datasætnavn, Libref PPP i PPP.TEST ikke oprettet med fx LIBNAME-sætningen.
SAND/FALSK makroer %if not %datasetexist(&data) %then %do; %put ERROR: Datasættet &data findes ikke!; %return; %end; må kun aflevere et 0 (falsk) eller 1 (sand) %macro datasetexist(data); %if %sysfunc(exist(&data)) %then %do; 1 %end; %else %do; 0 %end; %mend; %macro datasetexist(data); %sysfunc(exist(&data)) %mend;
Artikler pke@dst.dk Tegn og forstå alt om makrovariablers natur, scope osv. Makro Quoting / maskering Forstå brugen af maskeringsfunktioner %STR og %NRSTR %BQUOTE, %NRBQUOTE, og SUPERQ Afledte maskeringsfunktioner fx %QSUBSTR Makro halløj i DATA-steppet oversættelses/eksekveringstidspunkt
Spørgsmål? Kan tanker om sex få én til at nyse? Ja! Journal of the Royal Society of Medicine