My previous post highlighted presentations at SAS Global Forum 2016 that heavily used SAS/IML software. Several of the authors clearly want to share their work with the wider SAS analytical community. They include their SAS/IML program in an appendix or mention a web site or email address from which the reader can obtain the SAS/IML functions that implement the analysis.
As of SAS/IML 14.1, there is an easy way to share SAS/IML functions with others. The IML language now supports packages through the PACKAGE statement. A package is a collection of files that contains source code, documentation, example programs, and sample data. Packages are distributed as ZIP files.
This article shows how to install and use a package. A subsequent article will discuss how to author a package. For more information, see my 2016 SAS Global Forum paper, "Writing Packages: A New Way to Distribute and Use SAS/IML Programs".
The main steps to use a package are as follows:
- Download the ZIP file that contains a package.
- To install the package, use the PACKAGE INSTALL statement from within PROC IML or SAS/IML Studio.
- To learn how to use the package, read the package documentation and run some of the sample programs that the package provides.
- To use the functions in the package, use the PACKAGE LOAD statement to load the functions into your current SAS/IML session.
- To access sample data that the package provides, use the PACKAGE LIBNAME statement.
In the following sections, each step is illustrated by using the polygon package, which contains functions that compute geometric properties of planar polygons. You can download the package from the SAS/IML File Exchange.
Obtain the package
The SAS Communities Library is the recommended location to obtain packages. However, some authors might choose to post packages on GitHub or on their own web site.
Download the polygon package and save it to a location that SAS can access. This article assumes that the ZIP file is saved to the location C:\Packages\polygon.zip on a Windows PC.
Install the package
To install the package, run the following statements in SAS/IML 14.1 or later:
proc iml; package install "C:\Packages\polygon.zip"; quit; |
You only need to install a package one time. You can then call it in future PROC IML sessions. The package remains installed even after you exit from SAS and reboot your computer.
Read the documentation
The help directory in the ZIP file contains the full documentation for the package, often in the form of a PDF file. You can read that documentation by using a PDF reader outside of SAS. The PDF documentation might contain diagrams, equations, graphs, and other non-text information.
Authors should also provide a brief text-only version of the syntax. While running SAS, you can display the text-only version in the SAS log, as follows:
proc iml;
package help polygon; |
For the polygon package, the SAS log contains the following overview of the package and the syntax for every public module.
Polygon Package Description: Computational geometry for polygons A polygon is represented as an n x 2 matrix, where the rows represent adjacent vertices for the polygon. The polygon should be "open," which means that the last row does not equal the first row. <...More text...> Module Syntax: PolyArea(P); returns the areas of simple polygons. <...documentation for nine other functions...> PolyWindingNumber(P, R); returns the winding number of the polygon R around the point R. |
The purpose of the PACKAGE HELP syntax is to remind the user of the syntax of the functions in the package while inside of SAS.
Another way to learn to use a pakage is to examine and run sample programs that the package author provides. For the polygon package, you can look in the programs directory. The file Example.sas demonstrates calling functions in the package.
Load the functions
To read the functions in the package into the current IML session, use the PACKAGE LOAD statement, as follows:
package load polygon; |
The SAS log will display a NOTE for each modules that is loaded:
NOTE: Module _POLYAREA defined. NOTE: Module POLYAREA defined. <...More text...> NOTE: Module POLYSTACK defined. |
Notice that all function begin with a common prefix, in this case "POLY" (or "_POLY," for internal-only functions). This is a good programming practice because it reduces the likelihood that functions in one package conflict with functions in another package. For example, if you load two packages that each have a function named "COMPUTE" (or an equally generic name), then there will be a comflict. By using "POLY" as a prefix, there is less likely to be a name collision.
Call the functions
After the functions are loaded, you can call them from your program. For example, the following statements define the four vertices of a rectangle and then call functions from the package to compute the perimeter, area, and whether the polygon is a convex region.
P = {0 0, 1 0, 1 2, 0 2}; /* vertices of rectangle */ Perimeter = PolyPerimeter(P); Area = PolyArea(P); IsConvex = PolyIsConvex(P); print Perimeter Area IsConvex; |
Use sample data
Some packages include sample data sets. You can use the PACKAGE LIBNAME statement to create a SAS libref that points to the data subdirectory of an installed package. The following statements read in sample data for polygons that are defined in the Simple data set. After the vertices of the polygons are read, the PolyDraw subroutine is called to visualize the polygons in the data set.
package libname PolyData polygon; /* define libref */ use PolyData.Simple; /* sample data in package */ read all var {u v ID} into P; /* vertices; 3rd col is ID variable */ close PolyData.Simple; run PolyDraw(P); /* visualize the polygons */ |
Display package information
You can use the PACKAGE LIST statement to print the name and version of all installed packages. You can use the PACKAGE INFO command to obtain details about a specific package. The output for these statements is not shown.
package list; /* list all installed packages */ package info polygon; /* details about polygon package */ |
Summary
This article briefly describes how to install and use a SAS/IML package. Packages were introduced in SA/IML 14.1, which was released with SAS 9.4m3 in July 2015. This article shows how to download, install, load, and use packages that are written by others. In a separate article, you can learn how to create a package for others to use.
For additional details about packages, see Wicklin (2016). The official documentation of packages is contained in the "Packages" chapter in the SAS/IML User's Guide.
13 Comments
Awesome Post!
Rick, do you know of any site that contains data on other areas like the 'States48' Dataset in the polygon 'data' library? Would be fun to play around with
Regards Peter.
SAS has a huge supply of maps data sets for SAS/GRAPH customers. See the SAS Maps Online web site. You can also use the MAPIMPORT procedure in SAS/GRAPH to read i arbitrary shape files.
This is a useful new feature. Had you considered making package discovery and management a little easier? For example, weka has a simple interactive package manager where you can browse what is available, install, remove and compare available versions with what is installed.
Yes. In this first release, there are some manual steps that could be automated in the future if/when this feature becomes popular and people create dozens or hundreds of packages. If you don't want to wait, maybe you could write a package to do it!
Pingback: Create a package in SAS/IML - The DO Loop
For those who want to download the package file from within SAS can use the following code to do it:
filename pkg "c:\temp\polygon.zip";
proc http
url="https://communities.sas.com/kntur85557/attachments/kntur85557/sas_iml%40tkb/30/1/polygon.zip"
out=pkg
;
run;
proc iml;
package uninstall polygon;
package install pkg;
quit;
Thanks. I would recommend
package uninstall polygon(NOWARN);
The NOWARN option suppresses a message when you try to uninstall a package that is not installed.
I am trying to install the package in SAS with:
proc iml;
package install "F:\polygon.zip";
quit;
(F:\ is where I have the package stored)
But get this error every time:
ERROR 180-322: Statement is not valid or it is used out of proper order.
Any ideas as to why?
You would get this error if you are not running SAS/IML 14.1. To test that theory, submit the string
%put &SYSVLONG;
in SAS. The log should read
9.04.01M3P062415
which indicates that you are running SAS 9.4m3.
9.04.01M1P120413
This is what I received when I ran that statement. So do I need to be in SAS/IML 14.1 in order to install packages using proc iml?
Yes. The PACKAGE statement is a new statment in SAS/IML 14.1, which was released as part of SAS 9.4m3.
Is there a community repository to share user created packages?
Hi Ludwid. Yes! The community repository is called the "IML File Exchange." The link is in the post, but here is the direct link:
https://communities.sas.com/sas-iml-exchange