These release notes are current as of December 15, 2003. For updates to the release notes that are made after this date as well as other useful information, please see the Web site
This file contains the following information:
About this Release
What's New in S-PLUS 6.2
Bugs Fixed in S-PLUS 6.2
Supported Platforms and System Requirements
Using S-PLUS for UNIX from a Windows Desktop
Getting Help in S-PLUS
Contact Information for Feedback
Notes and Known Issues
S-PLUS 6.2 for UNIX/Linux includes an optional Java-based graphical user interface (GUI). Information on starting S-PLUS with the GUI enabled is in the section Running S-PLUS below. Due to limitations in the underlying Java implementation, performance of the GUI may be poor if you are displaying the S-PLUS GUI on a remote display (a different machine than the one S-PLUS on which is installed). For example, the display may be less than optimal in environments using an X-Windows emulator on a personal computer. Actual performance depends on the bandwidth of the local network as well as the X Windows implementation. For best results, display the GUI on the same machine where S-PLUS runs. The performance of the underlying S-PLUS engine is not affected by the use of remote displays.
The new features in S-PLUS 6.2 for UNIX/Linux improve upon S-PLUS 6.1 in three main areas: native drivers, verbose logging, and XML generation and reporting. There are also a number of enhancements to existing functions.
Technical papers on the native drivers, verbose logging, XML generation, and XML reporting are available through the $SHOME/doc/tech_papers directory.
S-PLUS 6.2 includes a variety of new features to add to or extend S-PLUS capabilities. Major additions include:
XML generation and reporting
In addition, existing functionality has been enhanced in the following areas:
Updated user-contributed libraries
Read and write SAS 9 files
This section briefly describes these additions and enhancements.
S-PLUS now includes access to the following databases via direct database drivers:
Exporting to databases now allows existing tables to be either replaced or appended to.
Direct database access is accomplished by using driver components which must be separately installed on the system that is running S-PLUS. These driver components are provided by the database vendor, and usually consist of components that can be called directly by S-PLUS to send and receive database information in the native format that the database supports.
This functionality is described in more detail in the Native Drivers technical paper available by navigating to $SHOME/doc/tech_papers.
Batch processing support to run S-PLUS scripts non-interactively has been a key feature of S-PLUS for a number of releases. Often, this is performed to execute S-PLUS scripts as part of a production process.
For example, in the medical and pharmaceutical industries, it is vital that data management and statistical tasks be validated and documented. All steps involved in experimentation and validation must be documented and preserved in order to demonstrate to oversight bodies that the results are complete, accurate, valid, and reproducible. In addition to source files and generated output, log files are typically retained for these purposes, and they include the following:
The log file has a structured format with the first seven columns reserved for line numbers and a line description tag. A colon in the eighth column separates these tags from the rest of the text; lines without colons in the eighth column are continuations of the previous tagged line. This makes parsing of the log file by Perl or other languages easy.
There is a header with information about the user, the machine, and the input and output files.
If a file gets sourced in by the input file, it is logged (e.g., S.init is sourced in) at the start of every S-PLUS session.
Each database that gets attached is logged.
All lines from the input file appear in the log file, identified by a line number.
Each complete input expression is timed.
A summary is logged when data is read in. The summary includes the disk location of the file, the resulting data frame size, the types of columns in the data frame, and missing value counts. Data frame reading and writing are also logged.
Errors are logged, but processing of the script continues.
On completion of the script, a summary of the entire processing is written.
This functionality is described in more detail in the Verbose Logging technical paper available by navigating to $SHOME/doc/tech_papers.
Extensible Markup Language (XML) provides a powerful mechanism for both storing and exchanging information between applications. S-PLUS includes two libraries of functions for working with XML:
SPXML library (Insightful) Introduces a rich report generation system for creating custom reports in a wide array of document formats. It uses the Extensible Stylesheet Language (XSL) to create HTML, PDF, Postscript, or RTF reports from an XML description of an S-PLUS object.
Included in the SPXML library are functions to read and write XML using S-PLUS-specific XML tags and then convert between these tags and the tags used by other applications. They allow S-PLUS objects to be created from any XML file, with their creation specified using XSL.
XML library (Bell Laboratories) Introduces a set of S-PLUS classes representing XML objects, such as XMLNode and XMLComment. A Document Object Model (DOM) parser is used to create an S-PLUS object from the information in an XML file. This object can be traversed using S-PLUS subscripting, manipulated using S-PLUS functions, and written back to a file if desired.
This functionality is described in more detail in the XML Generation and XML Reporting technical papers available by navigating to $SHOME/doc/tech_papers.
S-PLUS 6.2 now includes the DOX library for the design and graphical analysis of industrial experiments, generically called "design of experiments." This was previously available as a separate S-PLUS module.
Information on the functionality of this library is available through the help system. An on-line manual in PDF format will be included in the final release in $SHOME/library/dox.
The user-contributed libraries class, design, hmisc, MASS, nnet, and spatial have been part of the Windows libraries in the past, and are now in UNIX as well. Contributors to these libraries include Bill Venables, Brian Ripley, and Frank Harrell.
There are several new features in S-PLUS Graphlets, specifically with respect to the java.identify function:
Polygonal active regions
Multiple active regions that can be treated as a single region
In addition, a new spjgraph.jar file is included, containing updated java code. This should be used for viewing any Graphlets.
Out-of-memory problems that occur when zooming the Graphlet image too much have been fixed, as well as problems with passing NAs to java.identify with the winspj library. For more information, see the java.identify help file.
Note that all of these enhancements are implemented when viewing Graphlets in a Web browser or viewing the java.graph window while S-PLUS is running.
SAS 9 files can now be imported and exported.
The cummax() method returns a vector of non-decreasing (resp. non-increasing) numbers which are the cumulative maxima (resp. minima) of the values in x.
The file.realpath() function returns the absolute path name for a file.
substituteString() replaces parts of a string matching a regular expression.
The control parameters (e.g., convergence threshold and maximum iteration count) used in GLM and GAM have been tightened. These algorithms may now perform more iterations before declaring convergence, but the extra computation time allows for more reliable parameter estimates in some situations (particularly when highly-correlated covariates are present).
In this release, we have made a number of improvements to the quality of S-PLUS to make it a more reliable engine, especially for production purposes. Fixes were made in several areas:
Stability We have improved the overall stability of S-PLUS in several ways. Many reference counting errors and other internal engine errors have been fixed. Instabilities caused by working with large numbers of variables in statistics functions have also been addressed.
Statistics We improved many of the statistics functions to eliminate failures and correctly support options.
Accuracy We improved the accuracy of many of the probability distribution functions, especially for extreme parameter values. Some older single-precision functions have also been converted to double-precision.
Language Corrections were made to a number of core language functions, especially to deal with "corner cases" in a consistent fashion.
Data Access We improved the reliability of S-PLUS's data import and export functionality, to eliminate failures or data corruption which could occur with nonstandard file formats or import specifications.
GUI We have resolved a number of issues where dialogs or other elements of the GUI did not work as intended. We have also eliminated several crashes that could occur when working with the graphical user interface.
Graphics Errors in GUI graphics, command-line graphics (particularly for Trellis plots and timeDate charts), and Graphlets have been addressed.
Globalization We have addressed a few issues that arose when working with non-English characters in data, objects, and file names.
Performance The speed of some functions has been improved, and several memory leaks have been eliminated.
A complete list of Fixed Bugs in S-PLUS 6.2 is available.
S-PLUS 6.2 for UNIX/Linux is supported on the following:
- Solaris 2.8, 2.9 on SPARC 32-bit architecture
Red Hat Enterprise Linux 3.0
- Red Hat Linux 8, 9
IBM AIX 5.1
- HP-UX 11.0
- HP Alpha running Tru64 UNIX 4.0F or 5.1A
Before installing S-PLUS, review the minimum system configuration information in the table below. To determine the required RAM, sum the base RAM and the per-user RAM multiplied by the number of simultaneous users. For example, a single-user Linux system should have at least 64 + 32*1 = 96MB of RAM.
Solaris 2.8, 2.9
Red Hat 8, 9
The base RAM and per-user RAM listings can also be used to calculate minimum swap space requirements. In general, the minimum swap space required is twice the sum of the base RAM and the per-user RAM multiplied by the number of simultaneous users. For example, on a Solaris system with 3 simultaneous S-PLUS users, the minimum swap space is 2*(64+(40*3)) = 368MB.
Note that these values are minima; if you work with moderate sized data sets, these numbers may be insufficient for your needs. Note also that they are computed for simple command-line S-PLUS; if you intend to run the Java GUI, you should add approximately 100MB RAM per user to the numbers shown in the table. For example, on Solaris, we recommend approximately 200MB RAM for one user running the Java GUI.
S-PLUS 6.2 was developed under Red Hat 8 and tested/supported on Red Hat 8 and 9. These releases contain the kernels and compilers listed in the table below. Other Linux distributions, such as SuSE, are not officially supported or tested. However, if do you wish to use another Linux distribution, you should use one that has similar versions of the kernels and compilers (e.g., SuSE 6.4, 7.0, or 7.2). For more information on various Linux distributions, see www.distrowatch.com .
If you have difficulty running S-PLUS 6.2 on Red Hat Linux 8 or 9, see the Notes and Known Issues below for a possible workaround.
Red Hat OS
The Java runtime environment (JRE) version 1.4.0_01 is included in S-PLUS 6.2 .Your operating system must support JRE 1.4.0_01 in order to run the Java-enabled version of S-PLUS. Note that the JRE provided by S-PLUS is installed as part of the S-PLUS distribution, and under normal circumstances, it is used only by S-PLUS. If you have a different version of the JRE on your system, the JRE used by S-PLUS should not interfere with your other JRE applications, which will continue to use the version you've previously installed.
Solaris requirements for the JRE are available from
These release notes indicate the Java 2 SDK Standard Edition v1.4.0 is supported on Solaris 2.6, 7, 8, and 9 operating environments.
Linux requirements for the JRE are available from
These release notes indicate the following:
"This version of the Java 2 SDK is supported on Intel Pentium platform running the Linux kernel v 2.2.12 and glibc v 2.1.2-11. A minimum of 32 megabytes RAM are required. Recommended 48 megabytes of RAM, 16-bit color mode with KDE or the Gnome desktop and in conjunction with displays set to local hosts."
HP-UX requirements for the JRE are available from
These release notes provide the following recommendations:
"The HP-UX SDK for the Java(tm) 2 Platform version 1.4.0.01 provides the tools for developing and deploying Java applications on HP systems with HP-UX 11.0 and 11i PA-RISC.
"HP's SDK 1.4.0.01 includes Sun Microsystems' 1.4.0_01 build, all defects fixed in our SDK 1.3.1 and 1.4.0 releases, as well additional enhancements and defect fixes (described in the "Problems Fixed" section).
"The 1.4.0.01 SDK runs in 32-bit or 64-bit mode. It does not work with Itanium Processor Family (IPF) systems. Support for IPF systems will be provided in a separate release."
HP-UX requires or recommends various patches from HP in order to run Java 1.4. HP users should check the list of recommended and required patches at the following Web site:
Additional patches are required to run S-PLUS and use the Connect/C++ features on HP-UX. These patches are listed in INSTALL.TXT.
For complete installation instructions, please see the plain text file INSTALL.TXT located at the top level of your S-PLUS 6.2 CD-ROM. For instructions on installing S-PLUS modules with this release of S-PLUS, see the document $SHOME/doc/modinst_unix.pdf.
During installation, you are prompted for your S-PLUS serial number. You can find your new serial number on the S-PLUS 6.2 CD-ROM jewel case. The serial number you enter during installation is recorded and you can retrieve it later by typing Splus SERIAL at the UNIX prompt on your system.
Do NOT install this release over any existing version of S-PLUS. Instead, designate a clean installation directory for S-PLUS 6.2 and proceed with the installation as described in INSTALL.TXT.
Solaris versions of S-PLUS may be accessed remotely from a Windows desktop using X-server software. S-PLUS has been testing with the following products:
Reflection X (WRQ)
The graphical user interface (GUI) performance of S-PLUS will depend upon the X-server software. The performance of the underlying S-PLUS engine is not affected.
The following notes describe configurations that have been found to produce the best results.
Version 8.0.0 of Exceed was tested, and no significant performance problems were observed. When launching S-PLUS from an xterm, the xterm pops in front of the S-PLUS application when it first displays, and the S-PLUS application must be clicked with the mouse to recover desktop focus. Fonts were smaller than on other X-servers. Exceed seemed to have the best response time of any of the X-servers.
Version 10.0 of Reflection X was tested, and no performance problems were observed.
When using some versions of X-Win32 to start-up X-applications on your desktop, we have found that the "multiple windows" setting causes some latency in GUI response and some defects in displaying GUI elements. We recommend running in "single window" mode.
If you are connecting with XDMCP, then running in "single window" mode should present you with a default window manager from which you may run S-PLUS.
If you are connecting with rsh or rexec in "single window" mode, the application may be displayed in a "raw" X-session that lacks a window manager. We recommend that you start the Solaris default window manager (/usr/dt/bin/dtwm) using either the X-Win32 "Command" option, or from an xterm on the Solaris host. Once the window manager has been launched, the S-PLUS application should run and display successfully.
Before starting S-PLUS, you must do the following:
Set your DISPLAY environment variable to your local machine, if necessary.
Create an S-PLUS chapter to hold your work.
To use the Java related features of S-PLUS, you must be able to connect to your local X window server. Thus, you must have the environmental variable DISPLAY set and the X window server on your local machine must allow the S-PLUS server to create windows on your machine; see the UNIX programs xauth or xhost. Typically, if you can run xclock on your machine, then S-PLUS should also be able to access the X server.
To set your display from a C-like shell (csh, tcsh, etc.), use the setenv command:
% setenv DISPLAY < display_name>
where <display_name > is the name of your local machine. From the Bourne- and Korn-like shells (including sh, ksh, bash, etc.), use the following commands:
% DISPLAY=< display_name>;export DISPLAY
You do not need to do this if your DISPLAY variable is set already; check the output from echo $DISPLAY to be sure.
Creating an S-PLUS chapter is necessary for storing the data objects and external files you create in S-PLUS. The following commands create an S-PLUS chapter named mysplus for you to work in (be sure you don't have a mysplus directory in your home directory before typing these commands).
% mkdir mysplus
% cd mysplus
% Splus CHAPTER
If you do not create a chapter, S-PLUS automatically creates one for you named MySwork the first time you start S-PLUS.
You are now ready to start S-PLUS. S-PLUS may be launched in a variety of modes. The following lists each mode and the corresponding UNIX command-line expression for launching it. In all of the commands below, Splus refers to the script you use to launch S-PLUS 6.2 on your system.
S-PLUS command line without Java
S-PLUS command line supporting Java calls, Java graphics, and the Java help interface
% Splus -j
S-PLUS graphical user interface
% Splus -g
% Splus -g &
The second command using the ampersand "&" puts the GUI process into the background, freeing your xterm for other uses.
The -e flag may be added to either of the first two modes to enable command-line editing. The Commands window in the graphical user interface always allows basic editing.
S-PLUS 6.2 includes two additional flags, -jit and -helpoff:
The -jit flag works with the -g , -j, and -userapp flags and allows you to turn on the Java just-in-time compiler. This makes the graphical user interface and help system run faster but introduces instabilities that often lead to crashes. In particular, the just-in-time compiler often crashes while repainting graphical user interface elements such as the JavaHelp window and the Data window.
The -helpoff flag is useful only with the -g flag. It turns off the automatic invisible startup of the help system. The invisible startup improves initial responsiveness of the help system but adds a significant memory footprint to the current session. If you wish to optimize your available memory, this flag may prove useful.
S-PLUS 6.2 for UNIX/Linux uses JavaHelp 1.1.2 as its main help
system. You can use the
to turn the help system on and off, respectively, throughout your
S-PLUS session. To obtain help on a particular function, use the
? functions. The help
system contains on-line help files for all the S-PLUS libraries that
are attached at startup; help files for other libraries are available
once the libraries are attached.
To obtain help on the functionality of a particular dialog, click the Help
button in that dialog. For replacement functions such as
look for help on the corresponding regular function, such as
Look up Arithmetic, Assignment, and Comparison, respectively, for
arithmetic, assignment, and comparison operators.
In addition to this HTML file, a text version of these release notes is included in $SHOME/RELNOTES.TXT. The installation notes are available in $SHOME/INSTALL.TXT, and installation instructions for S-PLUS modules are located in $SHOME/doc/modinst_unix.pdf. A list of bugs fixed in this release is included in $SHOME/doc/FIXEDBUG.TXT . S-PLUS 6.2 has seven printed manuals which are also available as Adobe Acrobat PDF files in $SHOME/doc:
S-PLUS 6.1 for UNIX/Linux Supplement
S-PLUS 6 Installation and Maintenance Guide
Getting Started with S-PLUS 6.0
S-PLUS 6 User's Guide
S-PLUS 6 Guide to Statistics, Volume 1
S-PLUS 6 Guide to Statistics, Volume 2
S-PLUS 6 Programmer's Guide
In addition, new features to S-PLUS 6.2 are documented in four technical papers, located in $SHOME/doc/tech_papers:
Please feel free to contact us with questions or feedback about this release. Send all technical support queries and general comments to one of the locations listed below.
Contact Technical Support at Insightful Corporation:
Telephone: 206.283.8802 or 1.800.569.0123, ext. 235
Monday-Friday 6:00 a.m. PST (9:00 a.m. EST) to 5:00 p.m. PST (8:00 p.m. EST)
Christoph Merian-Ring 11, 4153
Tel: +41 61 717 9340 Fax: +41 61 717 9341
Basingstoke, Hampshire RG21 4HG
Tel: +44 (0) 1256 339800
Fax: +44 (0) 1256 339839
7, rue Auber
Tel: +33 0 5 62 27 70 60
Fax: +33 0 5 62 27 70 61
67, avenue du Maréchal Joffre
Tel: + 33 (0) 1 55 69 37 33
Fax: + 33 (0) 1 56 69 37 34
We are very interested in receiving information on possible bugs and usability enhancements from all users. Bug reports can be sent to the following e-mail address:
General information about this release of S-PLUS is available at
The list of S-PLUS Frequently Asked Questions is available from
These notes detail some characteristics and issues known to exists in this release. Our intent is to continue to resolve both known and newly discovered problems rapidly and to make improvements available to users through regular service releases.
S-PLUS 6.2 uses the latest Java code from Sun Microsystems (or the appropriate hardware vendor) as well as Sun's emerging JavaHelp system. Some instability in our product may be linked to issues with these Java technologies.
If you see a message that contains
"Can't connect to X11 window server using ...as the value of the DISPLAY variable"
when attempting to start S-PLUS, this most likely means you forgot to set your DISPLAY environment variable. See Running S-PLUS for details.
If you see messages about a connection to your display being refused by the server, you may need to use the UNIX xhost command to allow access to your X server from the S-PLUS server.
The Data Set lists in dialogs display the names of data frames in your working directory. To see built-in example data sets as well, assign them to your working directory by typing commands similar to the following in the Commands window:
fuel.frame <- fuel.frame
catalyst <- catalyst
environmental <- environmental
Alternatively, you can simply type the name of a built-in example data set into a Data Set text field.
The Java menus and dialogs are equipped with keyboard shortcuts that allow you to use your keyboard instead of the mouse to navigate the GUI. The keyboard shortcuts are indicated by underscores in menu and field names; combine these with the ALT key or its equivalent to navigate the main menu. For example, ALT-F opens the File menu, and once that menu is displayed, pressing E brings up the Export Data dialog. Similarly, ALT-G will opens the Graph menu and then pressing S brings up the Scatter Plot dialog.
Within dialogs, use the ALT key together with the indicated keyboard shortcuts to navigate to a desired field. For example, in the Scatter Plot dialog, use ALT-F to navigate to the x Axis Value field.
.JavaMethodfunction to call a static Java method from S-PLUS. For example, you can raise 2 to the power 10 and return the value as a double using.JavaMethod("java/lang/Math", "pow", "(DD)D", 2, 10)
For more information, see the chapter "Interfacing with Java" in the Programmer's Guide.
On Solaris, the current implementation of Sybase database access may fail within a Java application based on SplusUserApp with an error message:
Problem in openOrImportData(file, type, rowsToRead, ..:
Error -1 returned when opening data source '' for reading.
Internal error message was 'Error in dbopen DB-Library error:
Unable to connect: SQL Server is unavailable or does not exist.'.
If this occurs, here is a workaround:
If you wish to access the Sybase server "qaimage.insightful.com" within your SplusUserApp application, you must first execute the following Java code:
This code must be called from the main Java thread. This can be done by performing these calls in the "main" function of the application, before any other threads are created.
The Commands window in the graphical user interface uses the X-selection protocol for cutting and pasting; much of the rest of the GUI (including JavaHelp) uses the GUI-standard CTRL-C/CTRL-V for cutting and pasting. Thus, to paste an example from a JavaHelp help file window into the GUI Commands window, you need to select the example in JavaHelp, press CTRL-C, wait a moment to allow S-PLUS to copy the Java selection into the standard X clipboard buffer, then paste the example into the Commands window using your standard X paste command (typically a middle-click).
Because CTRL-C can be interpreted as a cut command, the GUI version of S-PLUS uses ESC as its interrupt key. On some X displays, you may need to double-middle-click to execute a paste in the Commands window.
To run the Java GUI on a remote display, you must have a display that supports the X Window System. This may be either a UNIX display or a PC running an X server such as X-Win32 or Reflection X. A text-only connection such as telnet does not support graphical applications.
Java has a number of known problems displaying on a remote display using the X Window System. For this reason, we suggest (if possible) that you limit your use of the Java-based GUI in this release to the console of the machine on which S-PLUS is installed. That is, treat this release of the Java-based GUI as a workstation release, rather than as a network client/server release.
Known problems with remote display include the following:
If the graphical user interface does not start on Solaris, you may need to patch your operating system. See Supported Platforms and System Requirements above.
Font substitutions produce awkward-looking fonts in menus and dialogs.
Dialogs tend to refresh slowly. A dialog may display initially with a gray background and take five or six seconds to refresh completely.
When using a remote display, Java renders the display on the server and then sends a bitmap of the application region to the remote display. The amount of information sent scales with the color depth of the display. With a Windows display, set the display to 256 colors for best performance. When running S-PLUS on Solaris and displaying on Linux, the Java virtual machine will not work properly with a 16 bit color display. Set your display to another color level to run Java properly.
Our experience to date suggests that Java on Linux is more reliable than Java on Solaris for remote displays. Java on Solaris appears to have some implementation issues that hinder proper display on non-Solaris displays.
The amount of memory available to a particular user in UNIX is controlled by various limits. To see them, type
at the UNIX prompt on your system. The defaults returned may be too small for S-PLUS. On one machine at Insightful Corporation, for example
% limit datasize
is 131072 kbytes by default. This can lead to S-PLUS running out of dynamic memory sooner than it otherwise should. The fix is to increase the limit, as in the following command:
% limit datasize unlimited
Some user limits are constrained by system limits that must be set by the superuser. If you maximize your user settings but still have dynamic memory problems, you may need to contact your system administrator to raise the system limits.
If you compile C or Fortran code for use with S-PLUS 6.2 , note that 32-bit and 64-bit versions of S-PLUS 6 both produce makefiles that create shared libraries named S.so by default. These libraries are incompatible between versions and must be compiled for either 32-bit or 64-bit versions of S-PLUS. We recommend creating shared libraries with different names for each platform (such as S_64.so and S_32.so). You can then use
dyn.opento open these libraries, if desired.
When starting S-PLUS on a display for a machine that has a different operating system than the machine on which S-PLUS is running, you may receive a large number of warnings with a message such as
"Font specified in font.properties not found [fontname]."
In most cases, this and similar messages can be safely ignored.
Error boxes from modeling dialogs do not have "always on top" status. They may become hidden behind the dialog box where they can't be seen.
On some remote displays, menu selections are not recognized if any part of a menu falls outside the application region. If dialogs fail to appear, increase the size of the application region to assure it contains the full menu.
Dialogs do not always recognize the ENTER key as equivalent to pressing the OK button. In particular, if the focus is on a combination box, the ENTER key is not recognized as the equivalent to the OK button. A workaround is to either press OK using the mouse or use the TAB key to move the focus to a field that is not a combination box and then press ENTER.
approx function has been upgraded to use
double-precision calculations in S-PLUS 6.2 . This means the results
may be slightly different in some cases than they were in S-PLUS 6.0.
In particular, you may get
NAs for some endpoints of
that were not
NAs in 6.0.
CONNECT/C++ applications that use stdio may shutdown with a bad address signal. A possible fix is to rebuild libsconnect.so using the following steps:
% cd $SHOME/sconnect
% Splus MAKE libsconnect
% cp libsconnect.so $SHOME/newfun/lib
After this is done, rebuild the CONNECT/C++ application. Permissions for the sconnect and lib directories and the files within them must be such that the user has access to read and write files.