		Windows-specific changes to R
		=============================

For changes since the release of R 2.0.0 on 4 Oct 2004 see the files
CHANGES.


rw2000
======

The miniR distribution no longer included compiled HTML help (to stop
it needing 10 floppies rather than 7).

Added Rgui script editor by Chris Jackson.  Supports object name
in window caption in edit() and fix().

Changed preferences menu button "Finish" to "OK".

Changed search order for user home directory to use "My Documents" 
directory after HOME and before HOMEDRIVE/HOMEPATH.

Added functions setWindowTitle(), getWindowTitle(), and 
getIdentification().

Added function getWindowsHandle().

The windows() device has a new 'bg' argument to set the background
colour (which still defaults to "transparent").

The C headers files are now installed into R_HOME/include rather than
R_HOME/src/include (as on Unix).

choose.files() now expands '~' to the user's home directory, as 
most other file system functions do.

(For those building R:) The Makefile now aborts if sub-makes in any of
several for-loops fail.

R BATCH|SHLIB|INSTALL|REMOVE no longer work: use Rcmd or R CMD (as
required under Unix) instead.

Rcmd INSTALL now does a `safe installation': it moves away any
existing installation of the packages, and moves them back if it
fails.  In any case, a failed installation is removed.  Bundles are
processed differently, by combining the DESCRIPTION and DESCRIPTION.in
files and processing each package separately.  Installation of a
bundle now fails as soon as installing any component package fails.
It is possible to install the current directory by `Rcmd INSTALL .' .

winMenuAdd() and winMenuAddItem() now allow addition of menu items to
the console and graphics windows and their popup menus.  Repeated
addition of the same menu no longer leads to duplicate menus.
winMenuDel() now deletes all submenus and items within the menu.

Building a complete distribution has an extra step, as the grid
vignettes depend on lattice (and so were incomplete in R 1.9.x on both
Unix and Windows).

The manual way of building packages is now deprecated, and it is no
longer possible to use it to build bundles (which was never documented).
Cross-building of packages is now done by the XINSTALL script.

bringToTop() in MDI mode now brings the whole MDI frame to the top
before raising the chosen window within it.

There is a new utility to check the installation (not miniR.exe).
Open a Command Prompt/MS-DOS window, cd to the top of the installation
(where the READMEs are) and run

	bin\md5check MD5

Any changed or missing files will be reported.  You can also
double-click to run the file -- it will open a window which will stay
open if there are any errors and close quickly otherwise.

The `Manuals' menu item in RGui is renamed to `Manuals (in PDF)', and
is now greyed out if no manuals are present (which GraphApp was not
doing correctly).

There is a new component in the main installer for the sources of the
help pages (the man subdirectories of the libraries) -- these were
not installed under Windows before.

The RGui menu item for installing packages from CRAN make uses of the
(non-default) setting of install.packages(dependencies = TRUE) to fetch
all the other packages needed to run those specified.

Improvements to file("clipboard") connections -- see ?file plus some
more warnings e.g. if the clipboard becomes full.

Memory leaks were fixed in rproxy.dll (used in (D)COM).  A break
to the debugger during rproxy.dll startup may be triggered by setting 
the DEBUG_RPROXY environment variable.



rw1091
======

Installing a package with a saved image was not exiting on an error
making the image (PR#6769).

Installing a package which failed did not return an error code from
Rcmd INSTALL (PR#6768).

choose.files(multi=FALSE) was liable to give incorrect results (PR#6818).

Workaround for bug in Microsoft critical update KB835732:  if HOMEPATH
environment variable is not set properly, R would not start (PR#6802).

Under ESS, Rterm could freeze when quitting (PR#6812).

The file.show() internal code failed to close its FindFirst handle and
so the directory on which it was used (often the R temporary
directory) could not be deleted from within R.

If a graphics window is opened in a minimized MDI session, it now
uses the physical monitor size instead of the zero-sized MDI frame.

Using PgUp whilst recording after a multiple of 4 plots failed to save
the current plot. (PR#3663 revisited.)

It is now possible to install a package with a man file called (INTRO).Rd.



rw1090
======

Both Rterm and Rgui now give usage information via the --help or -h
command-line flag.

There is now a "Misc|Break to debugger" menu option, enabled 
when a debugger is detected (somewhat fallibly), or infallibly by the
"--debug" command line option.  This will cause a trap to an external
debugger, e.g. for running Rgui under gdb.  If the menu item is
selected when not running under a debugger R is likely to crash.
If the "--debug" option is used, R will break to the debugger during
command line processing, allowing the startup process to be debugged.

Added "stay" argument to bringToTop(), to allow the user to specify
that a window should stay on top of other windows.  Also added "stay
on top" item to the popup menus.  All of these require R to be running
in SDI mode ("Rgui --sdi" or via the settings in file `Rconsole').

Changed windows() so that new windows fit within the MDI client
area.

Added winMenuNames() and winMenuItems() functions to query user menus.

Added menu items for www.r-project.org and CRAN on the help menu. 
(Wishlist PR#6492)

Added "R" command to be similar to Unix invocation of scripts, e.g.
"R CMD INSTALL" is the same as "Rcmd INSTALL".  Rcmd still exists for 
backwards compatibility (and to avoid conflicts over the name `R').
All of R, R CMD and Rcmd now accept --help.

Rcmd Rd2dvi can now be specified as such rather than as Rcmd Rd2dvi.sh.

Added "Paste commands only" to edit and popup menus in the Rgui console.
This allows copying of a block of output, but pasting only the commands
back to the console for re-execution.  (Code contributed by Tony Plate.)


Installation
------------

Parallel make (make -j2, say) can be used, but only usefully on
dual-processor (or perhaps hyperthreaded) hosts with at least 384Mb of
memory.

Installing now sorts in the C locale to ensure that a consistent sort
order is used.  (Some aspects of sorting used to be done in the locale
of the host machine, but Perl and the cygwin-based tools used the
ASCII collation order.)

The long-untested support for making Windows .hlp files has been withdrawn.

There is support for using K. Goto's fast BLAS.  On a 2.6Ghz P4 with
1Gb RAM and A a 1000 x 1000 matrix we had the following timings

	R BLAS	ATLAS	Goto
A %*% A	 3.7	0.65	0.56
svd(A)	16.2	7.77	6.83

Note that using a fast BLAS is much less effective for smaller
matrices as are more common in statistical applications.

Faster assembler code for exponentiation is used.

Cross-building of R itself now works again.  (It had been broken since
1.8.0.)


Building/installing packages
----------------------------

R CMD INSTALL/build/check map path names with spaces in to their short
forms.

R CMD INSTALL now supports versioned install via --with-package-versions.

Installing (binary) package bundles now checks the MD5 sums and
reports success, just as for packages.

Added "* DONE" to the end of INSTALL logs so --install option to CHECK
will work. (This is a repository maintainer option; see 
src/scripts/check.in for docs).


Internal changes
----------------

The fast bmp/png/jpeg code introduced in R 1.8.0 is used even for
256-color displays (as we have now been able to test it on such).

Until R 4.2, R's internal malloc etc were remapped to Rm_malloc etc and
(only) used in allocating memory for R objects, the Wilcoxon tests and a few
other memory-intensive applications.

Improved malloc routines from the current version of Doug Lea's malloc
(as suggested by David Teller) have enabled large memory areas to be
used more effectively, in particular those over 2Gb where OS support
were enabled. 

The initially requested memory is no longer reserved, but as that and
today's malloc is able to work with non-contiguous memory chunks that should
not matter.

The installer uses LZMA compression, so Inno Setup >= 4.1.5 is required.

Version 1.2.5 of libpng is now used in binary builds.


Bug fixes
---------

Fixed list.files() to properly handle paths like "C:", etc.

Fixed unlink() to accept empty file list for Unix consistency.

Fixed handling of whitespace in Rd2dvi.sh processing of DESCRIPTION
files.

Fixed handling of "--max-mem-size" syntax error on command line.

In RGui, ^T would not transpose the first and second characters on a
line.  (PR#5593)

Fixed junk character at start of a pipe(). (PR#5053)

R CMD SHLIB was computing dependencies for all C files, not just those
specified on the command line, and building the DLL from all *.o files
in the directory.

The sizes of metafiles in pixels were often coming out one pixel more
than requested, so the background was not quite all painted.  Now we
over-estimate.

Rproxy.dll would cause a crash when transferring large amounts of data.

Workaround for Microsoft's esoteric idea that date-times in 1970 before
1970-01-01 00:00:00 GMT are invalid, so as.POSIXct("1970-01-01
00:00:00") failed in timezones ahead of GMT.

Avoid possible segfault with browseURL() on urls of more than 264 chars
(although these are not guaranteed to work).



rw1081
======

Files in inst/ are installed later in the process of installing a
package (at the request of Ray Brownrigg: the build process was as
documented in `Writing R Extensions').  CVS files will not be installed.

The fast bmp/png/jpeg code introduced in R 1.8.0 is used for saving
from menus (and savePlot()) as well as for the devices.

Lines drawn at the extreme top or right of the device region (e.g. by
box(which="outer")) might have been drawn one pixel too far from the
origin and so perhaps clipped.

In 1.8.0 only, the bottom line of pixels was not copied to the file
for png/jpeg/bmp device plots (as the Windows GDI function used was
incorrectly documented).

File src/nmath/dnt.c was not being built for the standalone Rmath library.

packageStatus() now works under Windows.

Fixed instability under some Windows versions associated with
double buffering of the windows() device. (PR#5173)



rw1080
======

The initial size and position of the MDI frame can be set in Rconsole:
see the comments in .../etc/Rconsole.  The initial position of the
console window and graphics windows can be set in Rconsole and in the
GUI Preferences editor.

The windows() graphics device now has arguments xpos and ypos to set
the initial position, overriding the settings in Rconsole.

The windows() device has a form of double-buffering: the visible plot
is updated only when there has been no plotting for 0.1sec or if the
plot has not been updated for 0.5sec.  This is optional (but on by
default) and the timings can be changed: see ?windows.

The bmp/png/jpeg devices are around 10x faster when used on >8-bit
displays (but use more memory than before).

Rterm reverts to sending warning/error messages to stdout on Windows
95/98/ME.

Rcmd BATCH is now handled in C, and works again on Windows 95/98/ME.

Rcmd now sets the TEXINPUTS environment variable so that LaTeX
macros in share/texmf are available via e.g. "Rcmd latex.exe mydoc".

Calling dev.off() (or ending a session) when a windows() device is
open and recording plots automatically saves the current plot as the
last saved plot.

The windows (etc) devices use the Windows character metrics, which at
least on some systems have non-zero height and depth for space.  This
is now overridden.  (This showed up in the baseline placing for
plotmath expressions containing a space.)

A package's DLL used to be built only if standard source files were
seen.  Now src/Makefile.win is run if present, and if that generates
src/$(DLLNAME).dll the DLL is installed.  (DLLNAME is the package name
unless overridden.)

doc/manual/Makefile.win now has targets for fullrefman.{dvi,pdf}.

Added "Help | Search help..." menu item to Rgui as a front end to
help.search().



Bug fixes
---------

The changes to versioned install had ensured that the currently
installed copy of a package had its MD5 sums checked, not the version
waiting to be installed.  Now the correct version is checked.

The Copy, Paste, Copy&Paste and Kill buttons in the MDI mode failed to
restore focus to the console (see rw1070 RGui changes).

The BioConductor people had stolen the menu item for "Install
package(s) from CRAN..." so it was not being enabled/disabled
properly.

The windows() device was not plotting transparent single lines correctly.

The scrollbars on the data editor work better for very large matrices,
and correctly for more than 65535 columns.

The search for a directory for temporary files now checks that TMP and
TEMP point to actual writable directories.

PKG_FFLAGS is now used if provided.

bringToTop() tested against the wrong limit for the device list and so
would sometimes not work for high-numbered devices if lower-numbered
devices had been closed.

getwd() returns paths separated by / not \.

rproxy fixed so LAPACK gets loaded properly by (D)COM server.

Fixed installer so share/texmf files are installed with developer option.
(Sweave.sty continues to be installed in main option.)

Fixed MakePkg so that Rd files with missing line ends at EOF are corrected.



rw1071
======

The system() function printed a spurious warning when the input argument
was used.

The File|Change Dir...|Browse dialog could cause R to crash.

Fixed a bug in versioned install of binary package bundles.

Help for max.col was not being found in CHTML help: we have worked around
a bug in HHW.

The maximum allowed `pointsize' for a windows() device has been
increased to 48: some people have much bigger screens these days.

Rcmd BATCH in rw1070 incorrectly required the R::Utils Perl module.

The data editor no longer takes almost all the CPU cycles when running.

Fixed a bug in the data editor display that sometimes led to R failing
to shutdown.

Added some conditional compilation directives to the source so that the
replacement malloc() (see INSTALL) need not be used.

Changed the installer build code so that patch versions are named
rwXXXXpat.exe, development versions are named rwXXXXdev.exe, and
beta versions are named rwXXXXbeta.exe.

Fixed bugs that caused crash when windows were resized repeatedly.(PR#1711)

Changed help to use the 'title' parameter of file.show when displaying
help, for consistency with Unix versions.

Default in installer changed so a normal user installation will
include the source package installation files.

Moved the Sweave style file to the main install group.



rw1070
======

This version of R needs more memory and is slower to start up, because
it loads more packages by default.  This is only likely to be a
concern on machines with 16Mb of memory or less than 300MHz
processors.  For such machines append R_DEFAULT_PACKAGES=ctest to the
command line in the shortcut used to run R, when the memory usage will
be about equal to that of rw1062.

There is a new option to use file("clipboard") to read from or write
to the clipboard.  As most input/output functions in R use file(),
this makes it possible to read data from or write data to the
clipboard in many ways, including direct use of read/writeClipboard().

When using download.file() with the internal method and a proxy, the
user/password combination can be set to prompt the user with a
username/password dialog box, and this will be presented on proxy
authentication failure.

New function choose.files() for interactive multiple file selection.

The output from formatC() uses e+/-0n not e+/-00n for compatibility with
other platforms and with format().

A site-wide environment file R_HOME/etc/Renviron.site (or as set by
the `R_ENVIRON' environment variable) is now implemented on Windows.

The variable .SavedPlots in which plots are stored has been moved from
package:base to the user's workspace.

The warnings about changing the floating point control word are now
optional, selected by options(warn.FPU = TRUE).

The main thread is suspended briefly after Rprof() is called.  This
ensures that the timing thread gets started: on some builds and on
single-CPU machines this was not happening in 1.6.x (although it
did in 1.5.x, so it must be a compiler/runtime version issue).

Installation changes
--------------------

The installers have new options under `Additional tasks' which allow
the creation of Windows Registry entries to be de-selected by the user.

Rcmd.exe and Rprof have been moved to the main distribution (although
to use them you will need perl installed).

Tcl/Tk 8.4.1 is bundled in rw1070.exe.  You can still use your own
installation of Tcl/Tk: see the rw-FAQ.

The Makefiles that build the installers have been reorganized--see
the Maintainers.notes file for details, and INSTALL for new build
instructions.

HTML help changes
-----------------

The format of packages.html has changed, with packages listed by
library tree (as happens on Unix) when there is more than one tree.

The Java-based search index now covers all packages in all current
library trees.

When using help.start() with more than one library tree, an attempt is
made to correct the URLs in non-standard libraries which point to the
R_HOME/doc directory or to the base package.  Once this is done a
stamp `fixedHTMLlinks' is placed in the package directory, and
correction will only be done again if the R installation directory
is changed.

RGui changes
------------

The `Display file' menu item is now `Display file(s)' and allows
multiple file selection.

`Install packages from local zip files' from the `Packages' menu can
now install several files at once (by selecting multiple files in the
file selector).

Removed some calls to reset the size of the console, so it will
stay maximized throughout window operations.

The internal pager will page down with space or CTRL-F and page up
with minus or CTRL-B (key sequences which are widely used in Unix
pagers).  CTRL-A selects all the text.

The Change Directory dialog now starts in the current directory, not
always at the desktop.

RTerm changes
-------------

Rterm is now only regarded as interactive if both stdin and stdout are
a terminal: this overcomes a problem with getline.

System error messages (those which would appear in a dialog box in
Rgui) are written on stderr rather than stdout, as are R warnings and
error mesages.  If you want to capture errors as well as normal output, use
something like

	...\rterm --vanilla <foo.in >foo.out 2>&1

Installing packages
-------------------

Binary packages are retrieved from the bin/windows/contrib/1.7
directory on CRAN, so each new version will have its own set of
compatible packages.  The zip file names now include the version
number, as in mda_0.2-16.zip.

Files in the top-level directory of a source package are no longer
installed automatically: files to be installed must be put in an `inst'
sub-directory (as has long been recommended).  (The `demo' and `exec'
directories are also installed, as before.)

The BLAS library Rblas.dll is no longer automatically linked against
when building a package: as on Unix PKG_LIBS=$(BLAS_LIBS) is required
in Makevars(.win).

MD5 checksums are created on installation from sources (see
?checkMD5sums in package tools), and checked on installation by
install.packages().  If you see mismatches, this may be because files
are left over from an earlier install of the package: try deleting the
whole package directory and re-installing.

There is a new command-line flag --auto-zip to Rcmd INSTALL which
selects whether to zip up the data and/or help directories depending
on their size.  This is mainly for use with Rcmd INSTALL --build to
install and zip-up packages.



rw1062
======

New functions read/writeClipboard() to read from or write to the clipboard.

Hitting the key q (or Q) with an internal pager window in focus will
close the pager.

Source packages with a DESCRIPTION file with an incomplete last line
are now repaired.

Rcmd INSTALL tries to find canonical paths to make the check for
not installing on top of the source more foolprof.

The output when building R or source packages is much quieter.

Warnings are printed if a loaded DLL changes the floating point
control word: see ?dyn.load for the details.

Changed Windows README to README.rw1062, included standard README
and RESOURCES file in binary distribution.

Printing and copying from the menu of a graphics device now preserve
the active graphics device.

Fixed a crash that occurred when an attempt was made to view a file in
the pager but the file could not be opened (e.g. because another
application had it opened with exclusive access).



rw1061
======

Changed titles on help windows so topic name shows when minimized.

Dependencies were not being generated properly in packages using C++.

share/R/firstlib.R was not being included in the binary distribution.



rw1060
======

The installer program name has changed from SetupR.exe to rw1060.exe.

The miniR distribution has grown to eight floppies, and the zip files
are no longer distributed on CRAN.

The default memory limit has been raised to the smaller of 1Gb and the
amount of physical RAM.  (See the changes for rw1040 and rw1020 below.)

Support for bzip-ed connections has been added to the standard distribution.

update.packages() and install.packages() will not try to install a package
that is in use (with an informative warning).

Using HTML help has changed slightly: in particular
help(htmlhelp=TRUE) makes use of the setting of options("browser").

Ctrl-Z in Rgui or Rterm will signal EOF, and so can be used to
terminate a read by readLines() or scan(), for example.

bmp(), png(), jpeg() and win.metafile() devices can plot multiple
pages in separate files.

The preferred compiler is gcc-3.1: gcc-2.95.3 can still be used but
up-to-date header files are needed.

Making packages containing source code automagically makes dependency
information for C and C++ code: this is useful when experimenting with
packages, and especially for the packages which ship with R.



rw1051
======

file.rename() (which is by default used when saving workspaces) now
uses Windows API rather than ISO C functions.  This works around a
reported problem with Windows thinking a file was in use, and on
NT/2000/XP machines makes renaming an atomic operation (rather than
delete followed by move).

Bulding the standalone Rmath.dll was not making the import library
libRmath.a.

We may have been able to track down (to the isprint routine) the cause
of the FAQ Q2.14 about crashes caused by non-ASCII characters, and
hence to circumvent it.

File | Print on the menu of a windows() graphics device was not working.

The binary distribution could not make packages which needed to link
to Rblas.dll.



rw1050
======

There are few new Windows-specific features in this release: it has
been tuned to work better with Windows XP and a number of workarounds
added.


win.print() allows a printer to be specified.

help.start(browser=) is now supported: this may be useful if the
default browser does not support the Java-based search engine.

Very small circles are now forced to be visible: not all Windows
versions would display them.

Transparency in png() is now supported on `High Color' (16-bit) screens.

Changing plot resize type via the menu now works better for the current
plot (which is immediately redrawn).

BLAS support is now in a separate DLL, Rblas.dll.  This means that
packages using BLAS (KernSmooth, Matrix, bqtl, fracdiff, gss,
odesolve, quadprog, quantreg and subselect amongst those on CRAN) need
to be re-built.  The advantage is that less space is taken up overall,
and ATLAS can be used just by rebuilding Rblas.dll.

The installers now use bzip2 compression, so make smaller packages.

Cross-building automatically uses STAMP=NO for packages.

R and packages can now be built in a directory whose path contains
spaces (although we still don't recommend it).

If a package contains a script `configure.win' it will be run at the
start of installation.

Rcmd INSTALL and make pkg-foo test for attempted installation into the
source directory.

All the configuration options are now in file MkRules.

Unzipping is now handled by internal code based on zlib: unzip.dll is
no longer required.

Launching HTML files from the menus was not working with Netscape 6.2.x,
so a workaround has been provided.

Rgui.exe.manifest has been added to get XP-style widgets on Windows XP.

Some logical colour names have been changed to get consistent colour
schemes on Windows XP.

The books in the contents of CHTML for packages were not being sorted
correctly.

The floating-point control setting has been changed to use 64-bit
rather than 53-bit mantissas, which will result in slightly
different but generally more accurate results.



rw1041
======

Updating HTML indices, e.g. in help.start(), is done within a
try() construct.

help.start() has a new argument `update'.

Making packages now warns if there is a configure script.

ga.h was needed for building package `windlgs', but was omitted from the
`source package' code for rw1040.  It is now included.

Rcmd check was failing on Windows 9X, because additions in 1.4.0 were
not using Rsystem().



rw1040
======

If --max-mem-size is given a value greater than 256M, the requested
maximum memory is reserved (but not allocated) initially.  This will
enable the memory to be managed more efficiently, but does increase
the chance that R cannot be started.  There appears to be an effective
limit of about 1700M, at least under Windows 2000.

memory.limit() can now increase the memory limit of the current session.
This will not work if the limit is currently reached!

internet2.dll (see changes for rw1030) must be selected by the
--internet2 flag.

The miniR* distribution has grown to seven floppies, and no attempt is
now made to confine the zip files to floppy-size.

The background colour of a windows() window (outside the device
region) is now in the `Application Background' colour of the current
Windows colour scheme.  (It used to be LightGrey.)

Gamma correction is now applied to the background colour of a graphics
window.  (It has long been applied to the foreground colours.)  Users
of LCD screens may want to set something like gamma=2 when launching a
graphics window.

savePlot() now supports saving to PDF.

There is support for transparency in the devga device (which
encompasses screen windows, metafiles, printers and the bmp, jpeg and
png devices).  The default background colour is "transparent" for all
but the bitmap devices: this means that backgrounds are omitted when
plotting to/saving to most devices, and the colour that is visible is
that of the canvas (see below).  The png() device does support
transparent backgrounds, but this is not accessible through the menus
nor the savePlot() function.

The canvas colour of a windows() window can now be specified.  This is
is gamma-corrected, and defaults to "white".

There is a print method for saved plot histories, and individual
plots can be replayed from the command line by subsetting a
plot history variable.

The menus use `...' to indicate that they lead to a dialog box.

There is a new menu item  `Edit | Data editor...'  to edit (via fix())
R objects, especially data frames and matrices.

The console pop-up was checking the wrong item for `Buffered output'.

Plot histories are saved in a different format: those from earlier
versions of R cannot be played back and will be reported as corrupted.

Installing a package now first removes the data and demo directories
if they exist.

Building under (repaired) Cygwin -mno-cygwin environments is no longer
supported.  You probably do need the compiler system recommended for
rw1031 or later.

globalvar.h is no longer used: the header files now declare imported
variables.  This make it essential to use the R header files rather
than copying entries from them.

A bug in some linkers in linking against ATLAS has been circumvented.
There is now a bigger benefit in using ATLAS: on a PII with a
1000x1000 matrix, svd took 288 sec and La.svd 182 sec (without ATLAS)
and 59 sec (with); eigen took 163 sec and La.eigen 53 sec (without)
and 24 sec (with).



rw1031
======

Lines with lty > 1 and many pieces were being drawn very slowly on
Windows 2000 (but not 98/ME).  To work around this, such lines are
now drawn 5000 pieces at a time.

The dialog for the `Change dir' item now uses a standard folder
selection widget for its Browse button.

White backgrounds are now omitted for metafiles (as they are for
postscript, PDF and XFig plots), so white backgounds (the default)
appear to be transparent.

help.start() now updates the HTML search index (as well as the
packages index) when it is started up.  link.html.help() works better
when R_LIBS omits the drive, and uses relative links for the main
library, so R installations can be relocated in the file system.

The background colour of the GUI preferences editor and the
select.list() popup is now taken from the Windows colour scheme.

Rcmd INSTALL now rejects invalid options for --docs (rather than
ignoring them), and checks for the R version in the DESCRIPTION file
exactly the same way as Rcmd check (so with fewer spurious messages).

Added support for building with the ATLAS optimized BLAS library: on a
PII this speeds up La.svd on a 500x500 matrix by about 30%, and the
multiplication of two 1000x1000 matrices by about 8x. See INSTALL.

The recommended compiler system has been changed, but that recommended
for rw1030 still works.



rw1030
======

SetupR.exe and miniR* now include the nine `recommended' packages,
so the miniR* distribution needs six floppies rather than four.

Rgui has a new menu `Packages' with items to load packages, to install
packages from CRAN or from local zip files, and to update packages.

The packages list shown by help.start() now includes all packages in
all libraries, but the search index is still confined to the system
library.

The installers set up a file association for *.RData files, so
double-clicking on a *.RData file launches R in that directory and
loads the *.RData file.  Also, a *.RData file can be dropped onto a
shortcut to Rgui (or Rterm) on the desktop or in Windows Explorer.

Drag-and-drop of images (.RData and .rda) and source files (.R)
onto the Rgui.exe console window is now supported.

Profiling (as described in `Writing R Extensions') is now available.

There is a new `Save as PDF' option on the graphics device menu.

bringToTop() can specify the console window in Rgui (as -1).

The default graphics device is now windows() only in interactive use:
otherwise it is postscript().  (This affects the DCOM interface, which
is not interactive use.)

Support for earlier (pre-Feb 2000) mingw compilers has been dropped:
you must use a compiler system that supports --shared and has an
in-memory dlltool.

Rcmd check has been changed to be more robust to reported problems
with Perl's system() command under 16-bit versions of Windows.  It now
works for us under Windows 98.  (It has always worked under NT4 and
2000.)

Rcmd SHLIB no longer adds a version tab to the DLL, as this seemed to
cause some people problems under Windows 95/98/ME.

The correct file version information should now appear on Windows 2000
Version tab under Properties (working around a Windows 2000 bug).

rwinst.exe is no longer part of the distribution: use the newer
installers to install R, and the Packages menu in Rgui.exe to install
pre-compiled packages, or use an external unzip program.

The old-style Windows help is no longer part of the standard distribution,
but can be made from the sources.  It is no longer tested.

Make targets such as test-Reg have been moved to directory rw1030\tests.

[ DO NOT DO THIS: see ?download.file or rw1040 above:
The default internet module modules\internet.dll is built using basic
WinSock calls.  There is an alternative modules\internet2.dll which uses
WinInet calls (and so needs Internet Explorer installed) which can be
used as a replacement.  (Remove modules\internet.dll and then
rename modules\internet2.dll to modules\internet.dll.)]



rw1023
======

Alternative installers based on Inno Setup 2.0.x, either SetupR.exe or
miniR* (which fits on four floppies).

The location of R_HOME and the version can optionally be recorded in
the Registry (and will be used by the DCOM interface).  The Inno Setup
installers register the installation, and unregister on
uninstallation.  rwinst.exe has an option to register.  Program
rw1023\bin\RSetReg.exe will register, and rw1023\bin\RSetReg.exe /U
will unregister.

The windows() device no longer rounds width and height to the nearest inch.

You can override the settings Windows reports for pixels per inch
(sometimes it is seriously adrift).  See ?windows.

File `extract-usage' needed for codoc was missing from rw1022sp.zip.

The default memory limit (as reset by --max-mem-size) is set to at
least 16Mb, to allow R to start on machines with 8Mb of RAM.

link.html.help() has been re-written using connections and so is
several times faster.

Rcmd INSTALL now allows Windows-style paths to a tar file.

rproxy.dll is now built for StatConnector version 0.99: earlier versions
are no longer supported.

A Windows-specific bug in bitmap() which caused output to appear twice
has been fixed.

Rcmd check now stops when package-specific tests fail (not just
reports on the console).



rw1022
======

The long-running saga of importing R metafiles into Word is over;
lines are now visible in screen previews in Word.  It was necessary to
use `geometric' rather than `cosmetic' pens to achieve scalable line
widths in metafiles: Word was failing to show lines drawn with
`cosmetic' pens.

bringToTop() now works with MDI child windows as well as SDI windows.

Rcmd build/check use a different check for a directory, to work around
a bug in (some versions of) Windows Perl.

The datetime code has been modified to work around a problem reported
on a Win98 machine which caused times to be reported in GMT.  (This
seems a bug in a particular version of msvcrt.dll and few machines
were affected.)  A side-effect of the changes is that the timezone
names reported are usually more sensible (but sometimes less).

File etc/Makeconf-tests was missing from rw102Xsp.zip.

Rcmd SHLIB now supports compilation from C++ sources.

Rterm now saves and resets the console window title.

On Win2k, system(intern=TRUE) was failing to reset stderr to the console.



rw1021
======

Pipe connections now work under RGui and embedded R.dll, although
slower than under Rterm, and as they run with no stdin or stdout to
inherit what you can do with them is limited.  They work better for
reading than writing.

The installer will no longer crash trying to install addons with a
long PATH and R_HOME not set.  Similarly, Rcmd accepts long paths.

Using Rcmd INSTALL with an incorrect path specification ending in \ no
longer runs amok.

Internal pager no longer fails when given a file of one line and no
line ending.

Hyperlinks to other packages in CHTML files launched by help() will
now work irrespective of the working directory (but like HTML, only
to packages in the same library).  The .chm files do need to be
re-built under this version.

help(, winhelp=TRUE) will now find alias topics as well as main items.

Hitting the total memory allocation limit set by --max-mem-size will
give a warning (and will usually also lead to an error, and that may
suppress printing out the warning).

There is a new make target test-Reg to run the regression tests (which
now do I/0, so might give different results on Windows).

Rcmd build with the latest tar.exe will exclude files as intended.

There are further improvements in the GUI console receiving output
(e.g. from tcltk interactive functions) during input.  If you can,
arrange to send output in a single piece, or at least a whole line at
a time (although partial lines will now work).  For example, don't use
print() but capture the output in a text connection and use something
like cat(paste(outlines, "", collapse="\n)) to output a single string.

The initial rescaling is no longer done for windows(rescale="fixed"),
and the scrollbars in that mode are more responsive but move the
viewport 20 pixels at a time.



rw1020
======

This version has been compiled against msvcrt.dll not crtdll.dll.
This gives small speed increases and generally more accurate results.
Packages compiled against crtdll.dll will still work (as far as we are
aware), but for best results should be re-compiled.  (A few packages
need to be re-compiled for 1.2.0 on all platforms, and any that used
malloc directly need to be recompiled on this one.)


This release has a number of changes to bring its behaviour closer to that
of Unix versions of R.

-   The default font for graphics on windows(), win.printer() and
    win.metafile() devices is now Arial: the font numbers for the
    Times New Roman and Arial families have been interchanged.

-   The history is only saved when the workspace is (to be compatible with
    Unix versions of R) and whether it is restored is controlled by
    option --no-restore-history (implied by --no-restore and --vanilla):
    the default remains to restore.

-   Environment variables R_HISTFILE and R_HISTSIZE can be set to specify
    the name of the commands history file (default .Rhistory)
    and its maximum size (in lines, default 512).

-   More locale support is now enabled where supported by the version of
    Windows in use.  It means that sorting and comparison of character
    strings will be locale-specific.  You may not want this (the sort
    order in `English_United Kingdom' is aAbB..., for example) and
    setting Sys.setlocale("LC_COLLATE", "C") should give the previous
    behaviour.  Further, users of Windows 9x/ME should be able to use
    their native character set for the names of R objects (as NT/2000
    users always have: this is caused by the change to msvcrt.dll).
    (For the benefit of those used to Unix, LC_ALL can be set in the
    environment, although this is not usually supported by Windows,
    and setting individual LC_* such as LC_COLLATE will also work.)

-   It is possible to make DVI and HTML versions of the manuals:
    see file INSTALL in the source distribution.

-   New utility Rcmd.exe to emulate R CMD : see below.

-   unlink() now works the same way on Windows and Unix.  Thus on
    Windows it no longer deletes empty directories, but has a new
    argument recursive=TRUE to delete directories (empty or not).

-   The startup code looks for .Renviron, a file pointed to by
    environment variable R_ENVIRON and then .Renviron in the home
    directory.  This file can contain lines of the forms NAME=value
    and NAME=${NAME1-value} to take the value of NAME1 if set (and not
    empty), otherwise `value'.

-   make check no longer makes R, just runs the tests (as make test
    always has).  Tests are run in the C locale.


Gui changes
-----------

-   There are new console menu items `Load History' on the File menu and
    `Clear console' on the Edit menu. (The current line is not cleared.)

-   The menu items `Load/Save Image' are now called `Load/Save Workspace'.

-   The Print menu item on the File menu of a console or pager now prints
    the selection if there is one, and the whole (saved) contents otherwise.

-   There is a new `Save to File' item on the File menu of a console or
    pager which saves the selection if there is one, and the whole
    (saved) contents otherwise.

-   The Rgui console now uses the same history mechanism as Rterm. The
    history limit is now just on the number of lines (rather than on the
    number of lines and the total size).  The mechanism has been altered
    so that Rterm records repeated lines (as Rgui always did).

-   There are some additional command-line editing commands in Rgui: see
    the Help | Console information screen.  (There is also one
    addition, ^W, in Rterm: see README.rterm.)

-   Selection works slightly differently: if the selection extends beyond
    the last character on the line the (invisible) CRLF is made part of
    the selection, but not if only up to the last character is selected.

-   The data editor is no longer modal (which seems not to have worked
    properly in the GraphApp toolkit) and this allows its popups to be
    modal.

-   The size of the console scroll buffer can be set in file Rconsole,
    and resized (upwards) via the GUI preferences editor.

-   The GUI console copes much better with receiving output (e.g. from
    tcltk interactive functions) during input.



New utilities for preparing packages
------------------------------------

    There are several new utilities in the rw1020sp.zip distribution.

    The utilities Rd2dvi.sh Rd2txt Rdconv Rdindex Sd2Rd are no longer
    batch files but accessed through a new front-end Rcmd.exe, so if this
    is in your path (otherwise use ...\rw1020\bin\Rcmd) you can use

	Rcmd Rd2dvi.sh [options] files
	Rcmd Rd2txt              file
	Rcmd Rdconv    [options] file
	Rcmd Rdindex   [options] files
	Rcmd Sd2Rd     [options] file

    There are new utilities INSTALL, REMOVE, SHLIB which can be used
    to install a source package, remove a package and make a DLL, and
    implementations of the Unix R utilities BATCH, build and
    check. Invoke these by

	Rcmd INSTALL [options] pkgdir(s)
	Rcmd REMOVE  [options] pkg(s)
	Rcmd SHLIB   [options] file(s)
	Rcmd build   [options] pkgdir(s)
	Rcmd check   [options] pkgdir(s)
	Rcmd BATCH   [options] infile [outfile]

    Use option --help with any of these for fuller details.


The default for options("papersize") is set according to the locale,
and so might be set to "letter" under US or Canadian versions of
Windows.

Rterm in interactive use sets the title of the window it is running
in, and unsets it when it terminates.

The Windows memory manager proved to be (far) too slow to work with
the new generational garbage collector, so it has been replaced.  The
current memory manager rarely releases memory back to Windows (but
reuses memory very efficiently) so total memory usage will often grow
slowly over the course of a session.  Memory used for transient large
objects will normally be returned at garbage collection.  (Once memory
usage has gone over the 256Mb of address space that is initially
reserved, it is unlikely to be reduced much, but the allocated memory
will be reused.)  You can compile R to use the Windows memory manager
if you need to.

New function memory.size() showing the amount of memory currently in
use or the maximum that has been used.

New command-line option --max-mem-size to set the maximum memory
allocation: it has a minimum allowed value of 10M.  This is intended
to catch attempts to allocate excessive amounts of memory which may
cause other processes to run out of resources.  The default is the
smaller of the amount of physical RAM in the machine and 256Mb.

DLLs for packages (including standard packages supplied with R)
automatically gain version information when compiled under this
version.  (Use the Version tab on the Properties dialog box to see it,
or the new function DLL.version() within R.)

Windows (.hlp) help files now have hyperlinks to other objects within
the same package.

The windows() graphics device has a new argument `record' to set the
initial state of the recording flag, and this defaults to the setting
of the option "graphics.record" (and that defaults to FALSE).

The windows() graphics device has new options for what happens when it
is resized, which can be set from the command line of from the menu.
See ?windows for details.

New function bringToTop() to bring a graphics window to the top of the
windows stack (useful from menu actions, ...).

If the options setting for a pager or editor (or the editor argument
to edit.default) is a path containing a space, it is automatically
quoted if not already quoted.

The range of allowed text sizes in a windows/win.print device has been
increased, so smaller values of cex will work.  (The smallest allowed
text size is 2pt not 8pt.)

Interactive use of Rterm.exe on Windows 2000 systems is now possible
(including under ESS).

Better rendering of wide (lwd > 1) and dashed (lty != "solid") lines
on the windows/win.print device.

The installer rwinst.exe when first asked to install a package tries
to find a current installation of R, first from R_HOME if set in the
environment, then from the PATH (it looks for ...\rw1020\bin).

make pkgcheck-foo will unzip zipped example files if needed.



rw1011
======

New file README.Rterm providing basic documentation on Rterm.exe.

undoc() is now available under Windows.

There is a new script R_HOME/bin/build.sh, a version of R CMD build.
You will need R_HOME set as an environment variable to use it, and you
will need the full set of tools from tools.zip (see readme.packages)
in your path.

The batch wrappers to Perl files Rdconv.bat Rdindex.bat Rd2txt.bat
Sd2Rd.bat have been revised to work on more Perl/OS versions.

Setting cell widths from the menu in the data editor now works reliably.

Having an empty line at the beginning of .Rhistory no longer breaks the
history-recall mechanism in Rgui.

Characters using the AltGr key now work in interactive use of Rterm.
(AltGr used to work like Alt.)

Ctrl+V now works as described in a pager (pasting to the console).

Other versions of Tcl/Tk may be used by setting TCL_VERSION in
MkRules (but only 8.31 and 8.32 have been tested).

A file Makevars.win in the src directory of a package will be used in
preference to a file Makevars.

The Makefiles for packages now allow C++ code (with extension .cc or
.cpp or .C) in the src directory.

If you use a private library and HTML help, you need to copy R.css
from rw1011\library to each private library directory.

Function win.version() should give slightly more information (the
latest service pack number x.y) on Windows 2000.



rw1010
======

There is now a GUI preferences editor on the Edit menu in Rgui.

A data entry editor is now implemented.  This is similar to the Unix
one (see ?dataentry: that has itself been considerably enhanced in
parallel with the Windows version) with the additional features that
double-clicking in a cell turns it into an editable field (entered as
a new value by navigating away from the cell), and there is a
right-click popup menu.

Rterm will now load and save the commands history (as Rgui does).
There is a new item on the File menu in Rgui to save the commands
history at that point in a session, and a new function savehistory()
(only applicable in Rgui and Rterm).

Colours in Rconsole can be specified as "Windows" and will be taken
from the current Windows colour scheme. (The preferences editor will
save the actual colour, though.)

The placement of multiple pagers is now `random' (so they will not
always appear in the exact centre of the screen) and under the MDI
interface the pager rows and columns settings are now used.

The postscript() device can now spool plots to a printer. You will
need a suitable program to send a file to the spooler (or even to send
it to ghostscript to interpret PostScript for the printer): the RedMon
suite available from http://www.cs.wisc.edu/~ghost/rjl.html and
GhostScript distribution sites should provide suitable tools.  See
?postscript for further details.

The new xfig() device can be used, and a port of xfig to Windows (with
an X server and the Cygwin B20.1 environment and X11R6.4 installed) is at
ftp.franken.de:/pub/win32/develop/gnuwin32/cygwin/porters/Humblet_Pierre_A/B20
as  xfig-3.2.2-cygwin-b20.1-bin.tar.gz.

The R DLL and executables now contain standard Windows version
information, which will appear on a Version tab of the Properties
dialog box in Explorer.

The internal unzip and the installer now use unzip5.41, not unzip5.40, and
the DLL interface is incompatible.

There are changes in the tools needed to build R (see the file INSTALL)
and those recommended for building packages from source (see the file
readme.packages).

New makefile target zipdata-% to zip up data directories in packages.

If there is a file `Makefile.win' in a package src directory this
will be used rather than MakePkgs (and the tcltk package provides
an example).

There is an example package `windlgs' in the package sources
distribution that shows how to use graphapp to build dialog boxes to
be called from menus, with a worked example of a t test done in three
ways.  More details of graphapp, including a tutorial and a reference
manual, are at http://www.cs.usyd.edu.au/~loki/graphapp.

Optional support for the Tcl/Tk interface.  To use this you need to
install tcl831.exe from dev.scriptics.com, and you will need the Tcl
and Tk dlls in your path.  Also, you need to set the environment
variable TCL_LIBRARY, to something like c:/Program Files/Tcl/lib/tcl8.3.
The demos(tk*) will work on Windows.

The R mathematical functions can now be built as a DLL for use
with your own C programs.  See  src/nmath/standalone/README in the
sources.

Rdconv.bat no longer depends on having a Unix-compatible `cat' program
in your path.

A long-standing bug in the (vertical) alignment of symbols in plotmath
has been corrected.

Pagers should no longer flash when launched.

Launching a pager or data editor or graphics window now brings it
to the front, even from Rterm.exe. (Not for Tcl/Tk windows, unfortunately.)

Failure to load a DLL with dyn.load now gives extended error information.



rw1001
======

The installer, rwinst.exe, now checks for ZIP files as well as zip files,
as some browsers manage to map filenames to uppercase.

There are batch files  Rd2txt.bat Rdconv.bat Rdindex.bat Sd2Rd.bat
which are the equivalent of the Unix `R CMD foo' utilities mentioned in
`Writing R Extensions'.  To use these you must have R_HOME set as an
environment variable (using the form P:/R/rw1001).  There is also a
shell script Rd2dvi.sh which you can use if you have sh.exe (as
used to compile packages) and latex etc. The environment variable
XDVI sets the previewer, defaulting to xdvi.bat.

A file `Makevars' in the `src' directory of a package can be used to
add to/override the MakeDll makefile used to make foo.dll, as on Unix.
(See `Creating shared libraries', section 3.4 of `Writing R Extensions'.)

Under rare conditions (lots of very short input lines) the history buffer
could overrun and so cause crashes. This has been possible since rw0623,
but first caused reported problems in rw1000 and has now been fixed.

Certain HP printer drivers (e.g. the 6/6MP-Postscript driver) reset the
FPU and so were causing crashes.  This has been circumvented in this
version by restoring the settings before and after each page.

Building on a non-default drive should be more reliable, as Perl is
used to find the current drive.


    -------------------------------------------------------------------

	For changes prior to the release of R 1.0.0 on 29 Feb 2000
	see the file CHANGES0 in the source distribution.
