Inhoudsopgave
iii
Inhoudsopgave Voorwoord............................................................................................3 1 . Introductie tot het SAS Systeem.................................................5 Introductie..................................................................................................7 Een eerste voorbeeld.................................................................................8 Basis principes en basisbegrippen........................................................13 SAS-datasetstructuur..............................................................................17 SAS-datasets en -datalibraries...............................................................20 Keuze van variabelen.............................................................................21 Grafische afbeelding resultaat...............................................................23
2 . Inleiding DATA-step...................................................................27 Introductie................................................................................................29 Het DATA-statement..............................................................................29 Inlezen van gegevens..............................................................................31 INFILE-statement....................................................................................39 FILENAME-statement............................................................................43 Toevoegen van observaties aan een SAS-dataset...............................45 Overzicht DATA-step.............................................................................46
3 . Inleiding PROC-step...................................................................49 Introductie................................................................................................51 Algemene statements in PROC-steps...................................................51 PROC SORT.............................................................................................55 PROC PRINT...........................................................................................57 PROC CONTENTS..................................................................................59 Voorbeeld programma...........................................................................60
4 . Ontwikkelen en uitvoeren van SAS programma's................71 Introductie................................................................................................73 SAS Windowing Environment..............................................................73 Enterprise Guide.....................................................................................81 Batch processing......................................................................................97
Inhoudsopgave
iv
5 . DATA-step programmering.......................................................99 Introductie..............................................................................................101 Assignment............................................................................................101 Programma besturing...........................................................................104 DO-END-groepen.................................................................................111 Datum en tijd ........................................................................................114 'Verticale' bewerkingen........................................................................119 Debugging..............................................................................................121
6 . Functies........................................................................................125 Introductie..............................................................................................127 Character-functies.................................................................................127 Algemene numerieke functies.............................................................136 Rekenkundige functies.........................................................................137 Statistische functies...............................................................................139 Overige functies.....................................................................................141
7 . SAS-datasets als input...............................................................145 Introductie..............................................................................................147 SET-statement........................................................................................148 MERGE-statement.................................................................................152 UPDATE-statement..............................................................................159 Opties bij SET/MERGE/UPDATE.....................................................161
8 . Opmaken van output.................................................................165 Introductie..............................................................................................167 Lay-out van variabelen: FORMAT.....................................................167 PROC FORMAT....................................................................................170 Layout en aanmaak van externe files.................................................177 PUT-statement.......................................................................................179 Voorbeeldprogramma FILE- en PUT-statements.............................182
9 . Opslag en onderhoud van SAS-bestanden...........................187 Introductie..............................................................................................189 SAS-datalibraries...................................................................................189 Aanwijzen van SAS-datalibraries.......................................................190 Engines....................................................................................................192 LIBNAME-statement............................................................................194 Datalibrary-onderhoud........................................................................197
Inhoudsopgave
v
PROC COPY...........................................................................................197 PROC DATASETS.................................................................................198 PROC CATALOG..................................................................................203
10 . Output Delivery System (ODS)............................................207 Introductie..............................................................................................209 ODS basisprincipe.................................................................................210 Data in de voorbeelden........................................................................212 Aanpassing van de lay-out..................................................................214 DATA-step output (FILE PRINT, PUT).............................................223 Procedure output en ODS....................................................................225 Inhoudsopgave......................................................................................230 Stijldefinities binnen PROC PRINT....................................................234 ODS OUTPUT-bestemming.................................................................238
11 . Beschrijvende statistiek..........................................................241 Introductie..............................................................................................243 Voorbeeld thema...................................................................................243 PROC MEANS en PROC SUMMARY...............................................244 PROC FREQ ..........................................................................................256
12 . PROC TABULATE...................................................................267 Introductie..............................................................................................269 De procedure-beschrijving...................................................................270 Het TABLE-statement...........................................................................272 Voorbeeldprogramma's PROC TABULATE.....................................278 PROC TABULATE en ODS..................................................................288
13 . PROC REPORT.........................................................................293 Introductie..............................................................................................295 Interactieve rapport definitie ..............................................................297 PROC REPORT in statements.............................................................310 PROC REPORT en ODS.......................................................................319
14 . De SAS-macrotaal....................................................................323 Introductie..............................................................................................326 Macrovariabelen....................................................................................329 Definitie en gebruik van macro's........................................................335 Macro-statements..................................................................................337
Inhoudsopgave
vi
Macro-functies.......................................................................................347 Het quoting-principe en de quoting-functies....................................350 Plaats van macro-acties in de tijd........................................................357 Macro's in programma's.......................................................................363 Macro's ontwikkelen en testen............................................................365
15 . PROC SQL.................................................................................369 Introductie..............................................................................................371 De structuur van SQL...........................................................................372 Selecteren van informatie – het SELECT-statement.........................373 CREATE-statement...............................................................................390 Laden van macrovariabelen................................................................392 Gebruik van database systemen.........................................................394 Dictionary Tables..................................................................................397 Aanvullende voorbeelden....................................................................400
16 . Grafische presentatie...............................................................407 Introductie..............................................................................................410 De grafische omgeving.........................................................................412 Algemene statements............................................................................413 PROC GPLOT........................................................................................416 PROC GCHART....................................................................................428 Annotate-facility....................................................................................441 Replay- en Template-facility................................................................450 SAS/GRAPH output voor documenten............................................455 SAS/GRAPH en ODS...........................................................................458 Statistical Graphics................................................................................459
17 . DATA-step nader bekeken....................................................467 Introductie..............................................................................................470 De werking van de DATA-Step..........................................................470 Stored Program facility.........................................................................476 Het SET-statement.................................................................................478 Het MODIFY-statement.......................................................................480 DATA-step Views.................................................................................484 Het WINDOW- en DISPLAY-statement............................................491 Arrays......................................................................................................495 Voorbeeldprogramma WINDOW en ARRAY..................................499 Het IF-statement trauma .....................................................................504 LINK- en RETURN-statements...........................................................509
Inhoudsopgave
vii
DATA-Step Component Objects.........................................................510
18 . Perl-functies en expressies.....................................................523 Introductie..............................................................................................525 Definitie van 'Regular Expressions'....................................................525 De PRX-functies en CALL-routines....................................................529
19 . Ondersteunende routines.......................................................541 Introductie..............................................................................................543 SAS-Options...........................................................................................543 Format's..................................................................................................548 PROC TRANSPOSE..............................................................................554 PROC COMPARE.................................................................................558 Autoexec-routines.................................................................................562 SAS/FSP.................................................................................................562 PROC FSEDIT........................................................................................563 PROC FSBROWSE.................................................................................569 FS-commando's......................................................................................570
20 . Voorbeeldtoepassingen..........................................................571 Introductie..............................................................................................573 Tabellen raadplegen..............................................................................573 'Fuzzy Merge'.........................................................................................575 Verzenden van E-Mail..........................................................................584 Automatische wisseling van Powerpoint presentaties....................592
Index..................................................................................................597
Hoofdstuk 10
10 Output Delivery System (ODS)
208
10 Output Delivery System (ODS)
In dit hoofdstuk: Introductie....................................................................................................209 ODS basisprincipe......................................................................................210 Data in de voorbeelden..............................................................................212 Aanpassing van de lay-out........................................................................214 De Template Store...............................................................................................214 PROC TEMPLATE .............................................................................................216 Inheritance............................................................................................................220 Fonts......................................................................................................................221 Lay-out aanpassing bij RTF- of PDF-output....................................................223
DATA-step output (FILE PRINT, PUT)..................................................223 Procedure output en ODS..........................................................................225 SELECT en EXCLUDE........................................................................................226 Aanpassen van de lay-out van output-objecten..............................................227
Inhoudsopgave............................................................................................230 Inhoudsopgave bij HTML-output.....................................................................230 Inhoudsopgave bij RTF-documenten...............................................................233 Inhoudsopgave bij PDF-documenten...............................................................233
Stijldefinities binnen PROC PRINT.......................................................234 'Traffic lighting'....................................................................................................235 Voorbeeld..............................................................................................................235
ODS OUTPUT-bestemming.....................................................................238
Introductie
209
Introductie Er was een tijd dat computer output standaard naar een printer gestuurd werd. Die printer kon 132 tekens per regel afdrukken en 60 of 66 regels per pagina. Tegenwoordig gaat dat anders. Het resultaat kan nog steeds naar een printer gestuurd worden, maar de gemiddelde printer van tegenwoordig heeft een grote variëteit aan lettertypen, die in een grote range van afmetingen gebruikt kunnen worden. Maar meer en meer wordt de output niet geprint, maar gepubliceerd als web-pagina of opgenomen in een rapport dat veel meer omvat dan alleen de output. Dat vereist een andere aanmaak. Het Output Delivery System (ODS) is ontwikkeld om op een standaard manier output te kunnen aanmaken voor al die verschillende bestemmingen (destinations). Je kan ODS min of meer vergelijken met een driver: als gebruiker vertelt je wat er moet gebeuren en ODS zorgt er voor dat het gebeurt, aangepast aan de bestemming. ODS kan nog steeds output verzorgen voor een printer, maar het kan ook onder andere HTML- of XML-output aanmaken, RTF-documenten voor gebruik in office programma's (MS Office, OpenOffice en andere), PDFdocumenten en meer. Figuur 52 geeft dit schematisch weer.
Figuur 52: De positie van ODS tussen programma en bestemming van output. Voor elk element in de output van een procedure, zoals een titel, een kopregel, een voetnoot en honderden andere elementen zijn er binnen ODS standaard lay-out beschrijvingen aanwezig in zogenaamde Templates. Die Templates definiëren fonts, fontstijlen, eventueel kleuren en dergelijke voor iedere mogelijke output-bestemming. Dus als gebruiker geef je aan waar de output naar toe moet en ODS doet de rest.
210
10 Output Delivery System (ODS)
ODS basisprincipe Zonder het zichtbaar was is in de vorige hoofdstukken al gebruik gemaakt van ODS, want ook het sturen van output naar de SAS-List of naar een resultaten-venster in Enterprise Guide loopt via ODS. Maar om output naar een andere bestemming te sturen moet dit wel aangegeven worden. Stel dat de output in de vorm van een HTML-bestand moet worden geschreven. Dan is dat op te geven met een ODS-statement: ODS HTML BODY='pad en filenaam.html';
Vanaf dit punt zal alle output naar het opgegeven bestand worden geschreven, totdat deze bestemming weer gesloten wordt met: ODS HTML CLOSE;
In plaats van BODY= mag ook FILE= worden gebruikt. Veelal zal op het moment dat een andere bestemming opgegeven wordt geen behoefte meer bestaan aan output in de SAS-List. Die kan dan ook gesloten worden: ODS LISTING CLOSE;
En na het afsluiten van de HTML-bestemming moet weer teruggeschakeld worden naar de listing-bestemming: ODS LISTING;
Als je wel de listing-bestemming sluit, maar geen andere bestemming opent, dan zal alle output weggegooid worden. Er kunnen meerdere bestemmingen tegelijk open zijn. Programma 25 laat zien hoe dat in zijn werk gaat. Programma 25 toont drie veelgebruikte bestemmingen (Destinations in het ODS jargon) zien. Er zijn er echter veel meer. In Tabel 18 staan er een aantal opgesomd. De MarkUp-bestemming is op zichzelf al weer een verzameling van bestemmingen: verschillende varianten van HTML vallen daar onder, een variant van RTF (met meer sturingsmogelijkheden dan de standaard RTF-bestemming) en ook bijvoorbeeld comma-separated output.
ODS basisprincipe
211
ODS HTML BODY='e:\Werken met SAS\ProcPrint.HTML'; ODS RTF BODY='e:\Werken met SAS\ProcPrint.RTF'; ODS PDF BODY='e:\Werken met SAS\ProcPrint.PDF'; ODS LISTING CLOSE; PROC PRINT DATA=wms.KNMI(OBS=20); TITLE 'Dagelijkse weergegevens De Bilt (bron: KNMI)'; RUN; ODS HTML CLOSE; ODS RTF CLOSE; ODS PDF CLOSE; ODS LISTING;
Programma 25: Aanmaken van output voor meerdere bestemmingen tegelijk. Bestemming
Omschrijving
Document
Dit is een interne bestemming. De output die daarin opgeslagen wordt kan later alsnog naar een andere bestemming gestuurd worden.
Listing
De klassieke SAS-List bestemming. Dit is de default bestemming in batch mode en was tot en met SAS 9.2 de default bestemming in de Windowing Environment.
Output
Deze bestemming maakt een SAS-dataset aan met daarin de output.
HTML
HTML-4 bestanden. De HTML bestemming is vanaf SAS 9.3 de default bestemming in de Windowing Environment.
MarkUp
Een verzameling van 'tagset'-gebaseerde bestemmingen, waaronder XML, CHTML, CSV en meer. Ook eigen 'tagsets' kunnen aangemaakt worden.
PCL
Print-bestanden in HP's PCL formaat
PS
Postscript bestanden
PDF
PDF-bestand, voor gebruik vergelijkbaar programma
RTF
RTF-bestanden, voor gebruik in o.a. MS Office of OpenOffice
Tabel 18: Enkele ODS-bestemmingen.
met Acrobat
Reader
of een
212
10 Output Delivery System (ODS)
Data in de voorbeelden Voor voorbeelden in dit hoofdstuk worden weergegevens gebruikt die verzameld zijn door het KNMI. Het bestand bevat gegevens over het aantal uren zonneschijn, aantal millimeters neerslag en minimum-, maximum- en gemiddelde temperaturen op dagbasis. Over de periode van 1 januari 2000 tot en met 20 juli 2011.1 Om inzicht te krijgen in de data, drukt Programma 25 de eerste twintig observaties af in drie vormen: als HTML-bestand, als RTF-bestand en als PDF-bestand. De resultaten zijn te zien in Output 14A, B, C.
Output 14A: PROC PRINT output van Programma 25 als HTML.
1
Bron: Koninklijk Nederlands Meteorologisch Instituut (KNMI)
Data in de voorbeelden
Output 14B: PROC PRINT output van Programma 25 als RTF.
Output 14C: PROC PRINT output van Programma 25 als PDF.
213
214
10 Output Delivery System (ODS) De minimum temperatuur (MinTemp), maximum temperatuur (MaxTemp en de gemiddelde temperatuur (MeanTemp) zijn in graden Celcius, het aantal zonne-uren in uren en minuten (TIME-format) en de neerslag in millimeters.
Aanpassing van de lay-out In de inleiding is al aangegeven dat ODS wordt bestuurd door templates. Een template is een verzameling van instructies hoe output geformatteerd moet worden. Er zijn verschillende typen templates. Een belangrijke categorie zijn de 'Style-templates'. Daarin staan formatterings-instructies voor alle elementen in de output: voorgrond- en achtergrondkleuren, fonts, fontstijlen, fontgrootte, kaderlijnen enzovoort. Het kiezen van een bepaald style-template gebeurt in het ODS statement. In Programma 25 is steeds gewerkt met de default-stijl voor de betreffende bestemming. Als een andere stijl gewenst is wordt dit opgegeven zoals in: ODS HTML body='e:\Werken met SAS\ProcPrint.HTML' STYLE=Sketch;
Output 15 laat zien hoe dezelfde output als in Output 14A er uit ziet met de style-template Sketch.
De Template Store SAS levert bij de installatie een grote verzameling style-templates. Al die templates (niet alleen de style-templates, maar ook de andere) worden opgeslagen in zogenaamde 'Template Stores'. Een template store lijkt een beetje op een catalog, maar is niet hetzelfde. De templates die standaard met de SAS-installatie worden meegeleverd staan in de template store SASHELP.TMPLMST. Het is ook mogelijk zelf templates te maken. Die templates worden standaard in de template store SASUSER.TEMPLAT geplaatst, maar kunnen ook elders worden opgeslagen.
Aanpassing van de lay-out
215
Om een andere locatie op te geven voor het opslaan of opzoeken van templates wordt het ODS PATH-statement gebruikt. Daarin worden alle template stores opgegeven in de volgorde waarin ze door SAS gehanteerd moeten worden. Als er eigen templates gemaakt worden, dan moet in het ODS PATH-statement tenminste één template store voorzien worden van de indicatie UPDATE. In het ODS PATH-statement: ODS PATH WORK.TEMPLAT(UPDATE)CORP.TEMPLAT(READ) SASHELP.TMPLMST(READ);
wordt aangegeven dat eerst in WORK.TEMPLAT gezocht moet worden, daarna in CORP.TEMPLAT en tenslotte in SASHELP.TMPLMST. Eigen templates worden opgeslagen in WORK.TEMPLAT. De template store SASUSER.TEMPLAT is in dit statement dus uitgesloten!
Output 15: Zelfde output als Output 14A, maar nu met style-template Sketch.
216
10 Output Delivery System (ODS) Om te weten te komen welke style-templates beschikbaar zijn en waar ze staan kan het commando ODSTEMPLATES gegeven worden op de command-regel van de Display Manager. Als het Results-venster in de Display Manager actief is, dan kan het templates-venster geopend worden via het menu View Templates (Figuur 53).
Figuur 53: Het bekijken van een template definitie.
PROC TEMPLATE Als er geen passend style-template beschikbaar is, dan kan ook een eigen template aangemaakt worden. Het makkelijkst is om dit te doen door op de gewenste punten een bestaande template aan te passen. Dat voorkomt dat het hele template opnieuw moet worden opgebouwd. Laten we als voorbeeld de lay-out zoals die in Output 14A te zien is aanpassen als volgt: 1.
De titel moet in het rood komen;
2.
De observatienummers moeten kleiner en niet vet afgedrukt worden;
3.
Het font in de tabel moet veranderd worden in Times New Roman, iets groter en in groen;
4.
De achtergrond moet in plaats van grijs wit worden.
Het aanmaken en aanpassen van templates gebeurt met PROC TEMPLATE. Dat is een vrij uitgebreide en complexe procedure, maar
Aanpassing van de lay-out
217
gelukkig hebben we voor het aanpassen van een style-template er maar een klein stukje van nodig. Er moet dus een nieuwe style-template aangemaakt worden en, zoals al aangegeven hoeft dat niet vanaf nul, maar kan een bestaand template als startpunt genomen worden. Daarna hoeven alleen die elementen gedefinieerd te worden die anders moeten worden. Programma 26 laat de PROC TEMPLATE code zien en Output 16 het effect. PROC TEMPLATE; DEFINE STYLE WmSStyle; PARENT=styles.default; STYLE systemtitle FROM systemtitle / FOREGROUND=red; STYLE rowheader FROM rowheader / FONT_SIZE=2 FONT_WEIGHT=medium; STYLE data FROM data / FONT_FACE="times new roman" FONT_SIZE=5 FOREGROUND=green BACKGROUND=white ; END; RUN; ODS HTML BODY='e:\Werken met SAS\ProcPrint.HTML' STYLE=WmSstyle; ODS LISTING CLOSE; PROC PRINT DATA=wms.KNMI(OBS=20); TITLE 'Dagelijkse weergegevens De Bilt (Bron: KNMI)'; RUN; ODS HTML CLOSE; ODS LISTING;
Programma 26: PROC TEMPLATE om een stijl aan te passen en het gebruik in het ODS HTML-statement. Het eerste statement geeft aan dat we een stijl definiëren met de naam WmSstyle. Het PARENT-statement vertelt dat we de stijl styles.default (de default-stijl voor het aanmaken van HTML-bestanden) als startpunt nemen. Daarna volgen drie STYLE-statements, voor de definitie van de Systemtitle, de Rowheader en de Data. Die stijlen zijn al aanwezig in styles.default en met de constructie STYLE xxx FROM yyy / ... ;
218
10 Output Delivery System (ODS) geven we aan dat we uitgaan van de bestaande stijl en daar alleen wijzigingen in aanbrengen. Dit principe heet 'inheritance'. De wijzigingen zelf behoeven nauwelijks nadere uitleg. Vaak zal, zoals in Programma 26 het FROM-element hetzelfde zijn als het element dat gewijzigd wordt, maar dat hoeft niet. Als er een andere stijl aanwezig is in het template die dichter bij het gewenste resultaat komt, dan kan die als basis gebruikt worden.
Output 16: Het effect van het aanpassen van het template volgens Programma 26.
Aanpassing van de lay-out
219
De lijst met stijlelementen en -attributen is lang. Tabel 19 beschrijft een aantal stijlelementen en hun inheritance pad. Voor de volledige lijst wordt verwezen naar de SAS-documentatie. Tabel 20 bevat vervolgens enkele stijlattributen die in de praktijk nog al eens aangepast worden. Ook hier geldt: voor meer mogelijkheden wordt verwezen naar de SAS-documentatie. Stijlelement
Omschrijving
Container
'Oer-element': alle andere elementen erven direct of indirect van Container. Wijzigingen in Container werken overal door.
TitlesAndFooters
Formattering pagina titels en voetnoot regels
Container
SystemTitle
Eerste Title-regel
TitlesAndFooters
SystemTitle2
Tweede Title-regel (en zo verder tot Title10)
SystemTitle
SystemFooter
Eerste Footnote-regel
TitlesAndFooters
SystemFooter2
Tweede Footnote-regel (en zo verder tot Footnote10)
SystemFooter
Cell
Basiselement voor alle informatie in cellen
Container
Data
Formattering voor data-cellen
Cell
DataFixed
Formattering voor data-cellen in fixed font
Data
DataEmpty
Formattering voor lege data-cellen
Data
DataEmphasis
Formattering voor data-cellen die extra Data accent moeten krijgen
HeadersAndFooters
Formattering van kopregels en zo voort van tabellen
Cell
Header
Kopregels van een tabel
HeadersAndFooters
RowHeader
Begin van een regel, bij PROC PRINT: Header de OBS-kolom
Tabel 19: Enkele voorbeelden van stijlelementen.
Inheritance
220
10 Output Delivery System (ODS)
Stijlattribuut
Omschrijving
BACKGROUND=
Achtergrondkleur van cellen
FOREGROUND= of COLOR=
Kleur van tekst
FONT=
Lettertype
FONTFAMILY= of FONT_FACE=
Lijst van vervangende fonts, als de opgegeven font niet aanwezig is op een systeem.
FONTSIZE= of FONT_SIZE=
Lettergrootte. In HTML een relatieve grootte (1-7), voor andere bestemmingen in punten.
FONTSTYLE= of FONT_STYLE=
ITALIC | ROMAN | SLANT
FONTWEIGHT= of FONT_WEIGHT=
MEDIUM | BOLD | DEMI_BOLD | EXTRA_BOLD | LIGHT DEMI_LIGHT | EXTRA_LIGHT.
Tabel 20: Stijlattributen die regelmatig aangepast worden.
Inheritance Er is een hiërarchie in style-templates en style-elements. Zo werd in Programma 26 de stijl WmSStyle aangemaakt, waarbij via het PARENTstatement aangegeven werd, dat WmSStyle gebaseerd is op Styles.default, dat wil zeggen dat alle eigenschappen en attributen in Styles.default van toepassing zijn, behalve die welke in WmSSTyle aangepast worden. Een vergelijkbare hiërarchie is ook aanwezig binnen de stijlelementen. Bijvoorbeeld het stijlelement RowHeader is gebaseerd op Header. Header is weer gebaseerd op HeadersAndFooters. Als we die lijn volgen, komen we uiteindelijk terecht bij het stijlelement Container. Met andere woorden, als we Container veranderen, veranderen we al die andere stijlen ook, tenzij daar weer veranderingen overheen komen. In Programma 27 is een variant te zien van de PROC TEMPLATE coding van Programma 26. Het programma begint nu met een aanpassing van Container: het gebruik van een opvallend, afwijkend font: Dauphin. Dat zal dus doorwerken op meerdere plaatsen. De Header-style is veranderd, zodat er witte letters op een zwarte achtergrond komen. Maar RowHeader is afgeleid van Header (zie Tabel
Aanpassing van de lay-out
221
19), dus zonder speciale maatregelen zouden de observatienummers ook wit tegen een zwarte achtergrond worden. Nu kan je dat voorkomen door zelf weer een Foreground en Background kleur te specificeren, maar hier is gekozen voor een andere oplossing: bij FROM wordt nu de parent-style van Header opgegeven: HeadersAndFooters. Het effect is te zien in Output 17. PROC TEMPLATE; DEFINE STYLE WmSStyle; PARENT=styles.default; STYLE container from container/ font_face=dauphin; STYLE systemtitle FROM systemtitle / FOREGROUND=red; STYLE rowheader FROM headersandfooters / FONT_SIZE=3 FONT_WEIGHT=medium; STYLE header FROM header / FONT_SIZE=4 FONT_WEIGHT=bold FOREGROUND=white BACKGROUND=black; STYLE data FROM data / FONT_FACE="times new roman" FONT_SIZE=5 FOREGROUND=green BACKGROUND=white ; END; RUN;
Programma 27: Variant op de PROC TEMPLATE coding van Programma 26. Let op de aanpassing van Container en RowHeader.
Fonts ODS kent een groot aantal, maar niet alle TrueType fonts. Het Dauphinfont, zoals gebruikt in Programma 27 is bijvoorbeeld niet standaard bekend in ODS. Bij HTML-output is dat niet zo belangrijk, want daar wordt het font bepaald in de browser. Die kent het wel en dus wordt het correct getoond in Output 17. Bij RTF- of PDF-output wordt het font wel binnen ODS vastgelegd, met als gevolg dat er een probleem ontstaat bij Programma 27. In de log komt er een waarschuwing en de output toont het dauphin-font niet: WARNING: Font specification "dauphin" failed. Using default font family instead.
Met PROC FONTREG is het overigens mogelijk extra fonts aan ODS bekend te maken.
222
10 Output Delivery System (ODS)
Output 17: Het effect van Inheritence: het font in Container is veranderd.
Aanpassing van de lay-out
223
Lay-out aanpassing bij RTF- of PDF-output In principe zijn templates onafhankelijk van de bestemming. Alleen elementen die niet passen bij die bestemming worden niet overgenomen, daar wordt een default stijl voor gehanteerd. Nadere bestudering van Output 14 laat zien dat de RTF- en PDF-output (14B en 14C) net iets anders er uit ziet als de HTML-output (14A). Dat komt doordat de RTF- en PDF-styles niet direct gebaseerd zijn op Styles.default, maar op Styles.Printer (dat op zijn beurt weer afgeleid is van Styles.default). In Styles.Printer wordt als standaard font Times New Roman gedefinieerd. Als het gewenst is om RTF-output standaard in het Arial-font aan te maken, dan is het dus voldoende om Container aan te passen, zoals in Programma 28 wordt getoond. PROC TEMPLATE; DEFINE STYLE MyRTFStyle; PARENT=styles.rtf; STYLE Container FROM Container / FONT_FACE="arial"; END; RUN; ODS RTF BODY='e:\Werken met SAS\RTFPrint.rtf' STYLE=MyRTFStyle; ODS LISTING CLOSE; PROC PRINT DATA=wms.KNMI(OBS=20); TITLE 'Dagelijkse weergegevens De Bilt (Bron: KNMI)'; RUN; ODS RTF CLOSE; ODS LISTING;
Programma 28: Een RTF-style die zorgt voor output in het Arial-font.
DATA-step output (FILE PRINT, PUT) PROC PRINT is natuurlijk niet de enige manier om output te produceren. In volgende hoofdstukken komen nog diverse andere procedures aan de orde.
224
10 Output Delivery System (ODS) Ook in de DATA-step kan natuurlijk output aangemaakt worden, zoals dat in Programma 23 (bladzij 183) werd gedemonstreerd. Om de daar aangemaakte sinus-curve als HTML-bestand te krijgen volstaat het toevoegen van een ODS HTML-statement er voor en een ODS HTML CLOSE-satement er achter. Het resultaat zie er dan uit als in Output 18.
Output 18: Output van Programma 23 als HTML-bestand.
Procedure output en ODS
225
Procedure output en ODS Bij veel SAS-procedures bestaat de output uit meer dan één deel. In ODS termen vormen al die delen 'output-objects'. Als voorbeeld gebruiken we PROC CORR. PROC CORR berekent correlaties tussen variabelen. Met de informatie in de KNMI-dataset kunnen we de correlatie berekenen tussen het aantal uren zonneschijn en het aantal millimeters neerslag. Intuïtief kunnen we bedenken dat die correlatie negatief is. In zijn meest simpele vorm hoeven alleen de variabelen waartussen de correlatie berekend moet worden in een VAR-statement genoteerd te worden (Programma 29). ODS HTML BODY="e:\Werken met SAS\PROC CORR.html"; ODS LISTING CLOSE; ODS TRACE ON; PROC CORR DATA=wms.Knmi; VAR Neerslag ZonneUren; RUN; ODS HTML CLOSE; ODS TRACE OFF; ODS LISTING;
Programma 29: PROC CORR berekent de correlatie tussen neerslag en zonne-uren. In de output (Output 19) is duidelijk te zien dat de output uit drie delen bestaat, dus er zijn 3 'output-objects'. ODS kent voor elk van die objecten een omschrijving waarin de lay-out gedefinieerd wordt. Met de kennis van de output-objecten kunnen we nu twee dingen doen: we kunnen objecten selectief opnemen of weglaten en we kunnen de lay-out van ieder object afzonderlijk aanpassen. Om te weten welke objecten er aangemaakt worden bestaat een tracevoorziening: ODS TRACE ON; start de tracing en ODS TRACE OFF; stopt deze weer. Dit is opgenomen in Programma 29. Als de trace aanstaat, zal SAS de aangemaakte objecten opnemen in de SAS-log, zoals weergegeven in Log 8.
226
10 Output Delivery System (ODS)
Output 19: PROC CORR-output in HTML format.
SELECT en EXCLUDE Het ODS SELECT-statement en het ODS EXCLUDE-statement zijn voor ODS wat KEEP en DROP zijn voor een DATA-step. ODS SELECT specificeert welke output-objecten opgenomen moeten worden en ODS EXLUDE welke weggelaten moeten worden. Stel dat we bij de PROC CORR-output (zie Output 19 en Log 8) alleen geïnteresseerd zijn in de correlatie matrix. Dan kunnen we dat op de volgende twee manieren bereiken: ODS SELECT PearsonCorr;
of ODS EXCLUDE VarInformation SimpleStats;
voorafgaand aan het PROC-statement.
Procedure output en ODS
227
Output Added: ------------Name: VarInformation Label: Variables Information Template: base.corr.VarInfo Path: Corr.VarInformation ------------Output Added: ------------Name: SimpleStats Label: Simple Statistics Template: base.corr.UniStat Path: Corr.SimpleStats ------------Output Added: ------------Name: PearsonCorr Label: Pearson Correlations Template: base.corr.StackedMatrix Path: Corr.PearsonCorr ------------NOTE: PROCEDURE CORR used (Total process time): real time 0.59 seconds cpu time 0.00 seconds
Log 8: ODS TRACE output in de SAS Log: de output-objects van PROC CORR.
Aanpassen van de lay-out van output-objecten In Log 8 is ook te zien welke templates gebruikt worden om de vormgeving van de verschillende output-objecten te sturen. Ook die templates zijn te vinden in SASHELP.TMPLMST. Programma 30 laat als voorbeeld de definitie zien van VarInformation. Als we enkele aspecten van deze definitie willen aanpassen, dan kunnen we die veranderen, echter niet rechtstreeks in SASHELP.TMPLMST, want die template store is 'read only'. Als we de lay-out willen aanpassen is de makkelijkste manier om een gedeeltelijke kopie te maken Dat is te zien in het eerste deel van Programma 31. Het begint met een EDIT statement om aan te geven welk template veranderd moet worden. Door te vergelijken met Programma 30 valt op dat we de stijl RowHeader in de definitie van NVars en Variables hebben vervangen door VarHeader. De reden is
228
10 Output Delivery System (ODS) simpel: RowHeader wordt op vele plaatsen gebruikt. Als we een andere stijl voor RowHeader zouden definiëren dan verandert de vormgeving niet alleen in de PROC CORR-output, maar overal waar RowHeader wordt gebruikt. Bij VarNames is geen expliciete stijl opgegeven. Dat doen we wel, namelijk VarList. Vervolgens is het natuurlijk wel noodzakelijk om die nieuwe stijlen ook te definiëren. Dat gebeurt in het tweede deel van PROC TEMPLATE. We kiezen een paar opvallende attributen om zo het effect te zien. Omdat we ons nu concentreren op het VarInformation object laten we de rest van de PROC CORR-output weg, door middel van het ODS SELECT-statement. Output 20 laat het effect zien. proc template; define table Base.Corr.VarInfo; notes "Variable Information"; dynamic VarWidth; column NVars Variables VarNames; translate _val_=0 into ""; define NVars; space = 1; format = 4.0; style = RowHeader; id; merge; end; define Variables; space = 4; style = RowHeader; id; end; define VarNames; width_max = VarWidth; width = 1; flow; maximize; end; end; run;
Programma 30: De template-definitie van het VarInformation-object van PROC CORR in SASHELP.TMPLMST.
Procedure output en ODS
229
Let op: we hebben in Programma 31 de template van één van de PROC CORR output-objecten veranderd. Die verandering geldt nu voor alle PROC CORR-output die volgt. Om terug te keren naar de originele layout, zijn er twee mogelijkheden: de gewijzigde definitie verwijderen of de template store waarin de wijziging staat uitschakelen door een ODS PATH-statement waar hij niet in voorkomt. PROC TEMPLATE; EDIT Base.Corr.VarInfo; DEFINE NVars; STYLE = varHeader; END; DEFINE Variables; STYLE = varHeader; END; DEFINE VarNames; STYLE = varlist; END; END; DEFINE STYLE NewVarInfo; PARENT=styles.default; STYLE varheader FROM rowheader/ BACKGROUND = pink FONTWEIGHT=light; STYLE varlist FROM rowheader / BACKGROND = yellow FONT_FACE = 'times new roman' FONT_STYLE = italic; END; RUN; ODS HTML BODY="e:\Werken met SAS\PROC CORR.html" STYLE=NewVarInfo; ODS LISTING CLOSE; ODS SELECT VarInformation; PROC CORR DATA=wms.knmi; VAR Neerslag ZonneUren; RUN; ODS HTML CLOSE; ODS LISTING;
Programma 31: Een aangepaste stijl voor het VarInformation-object van PROC CORR.
230
10 Output Delivery System (ODS)
Output 20: Output van Programma 31: een aangepast VarInformation-object.
Inhoudsopgave ODS kan tijdens het aanmaken van de output automatisch een inhoudsopgave opstellen, waarbij elke BY-groep of elk output-object automatisch opgenomen wordt. De manier waarop het gebeurt is afhankelijk van de bestemming. Bij HTML-output komt de inhoudsopgave in een aparte file, die eventueel via een 'frame' gecombineerd kan worden met het hoofdbestand. Bij RTF- en PDF-documenten is een inhoudsopgave onderdeel van het bestand zelf. Dat heeft tot consequentie dat ook de manier van aanmaken iets anders is.
Inhoudsopgave bij HTML-output Om een inhoudsopgave bij HTML-output aan te maken is het voldoende om het bestand op te geven waar die in opgeslagen moet worden, zoals in: ODS HTML BODY="e:\Werken met SAS\MyOutput.html" CONTENTS="e:\Werken met SAS\MyOutputTOC.html";
Nog een stap verder is het om de inhoudsopgave samen met de reguliere output op één scherm te zetten, door ze te combineren in een frame. Om dat te bereiken moet ook een frame-bestand aangemaakt
Inhoudsopgave
231
worden. De manier waarop dat gebeurt ligt voor de hand: voeg een FRAME-optie toe: ODS HTML BODY="e:\Werken met SAS\MyOutput.html" CONTENTS="e:\Werken met SAS\MyOutputTOC.html" FRAME="e:\Werken met SAS\MyOutputFrame.html";
Het bovenstaande werkt goed bij Internet Explorer, maar niet altijd bij Firefox. Als het frame geopend wordt via 'Open File', dan volgt er een foutboodschap: 'Firefox doesn't know how to open this address, because the protocol (e) isn't associated with any program.'. De bron van het probleem is, dat in de links van het frame-bestand naar de twee andere bestanden de volledige naam opgenomen wordt, beginnend met 'e:\' en dat dit door Firefox geïnterpreteerd wordt als een protocol indicatie, zoals HTTP: of FTP:. Het probleem kan voorkomen worden door het toevoegen van de optie BASE="file:///". Dat plaatst de toevoeging 'file:///' voor elke referentie, waardoor Firefox het protocoltype goed herkent. Als de HTML-output aangemaakt wordt voor opname in een website, dan is het meestal gewenst om geen compleet pad op te geven, maar alleen de bestandsnaam. Dat kan door gebruik te maken van het FILENAME-statement en de PATH-optie in het ODS HTML-statement, zoals bijvoorbeeld in: FILENAME webfiles "e:\Werken met SAS\"; ODS HTML PATH=webfiles BODY="MyOutput.html" CONTENTS="MyOutputTOC.html" FRAME="MyOutputFrame.html";
Een en ander wordt geïllustreerd in Programma 32 en Output 21. De kern van het programma bestaat uit een DATA-step en de daarop volgende PROC PRINT-step. In de DATA-step wordt de variabele Datum gekopieerd naar de variabele Maand. Vervolgens wordt die variabele gebruikt in het BY-statement van PROC PRINT, waarbij Maand het format MONYY meekrijgt, om te groeperen per maand en ook per maand een regel in de inhoudsopgave te maken. Daardoor kan Datum gewoon opgenomen worden in de output, met een DATEformat. De samenstelling van het ODS HTML-statement is hierboven al beschreven. De lay-out van de inhoudsopgave is vie PROC TEMPLATE aan te passen, echter dat valt buiten de scope van dit boek.
232
10 Output Delivery System (ODS)
FILENAME weblib "e:\Werken met SAS\"; ODS HTML PATH=weblib BODY="KNMIdata.html" CONTENTS="KNMItoc.html" FRAME="KNMIframe.html"; ODS LISTING CLOSE; DATA KNMI; SET wms.KNMI; Maand = Datum; RUN; PROC PRINT DATA=KNMI; BY Maand; Format Maand monyy.; RUN; ODS HTML CLOSE; ODS LISTING;
Programma 32: Aanmaken van HTML-output met Table of Contents.
Output 21: HTML-output met Table of Contents, na klik op Augustus 2004.