	For changes since the release of R 1.0.0 on 29 Feb 2000
	see the file CHANGES


rw1000
======

The highlight colour used for help files in the internal pager can now
be set in the file Rconsole.

tempfile() can have argument `pattern' of length greater than 1.

A bug in tab expansion in the console and internal pager has been
corrected.

link.html.help() is able to cope with packages with missing TITLE files.


rw0990
======

The console and internal pager now have horizontal scollbars. These
are disabled (greyed out) if no text is obscured in the current view.

Help menu items will be greyed out if the corresponding files are not
installed.

Many of the menu items now call internal functions and so are much
faster, but produce nothing on the console.

Help files will be displayed in the internal pager with headings
in a contrasting colour.

There are new functions winDialog() and winDialogString() to produce
dialog boxes, and functions winMenu* (use ?winMenus) to manipulate
user menus.

Following Unix, the handling of help(, offline=TRUE) has been altered.
It will be necessary to adjust helpPRINT.bat to set the TEXINPUTS path
to find Rd.sty. TeX processing of these help files normally uses LaTeX
package `ae' to handle Latin-1 characters: this can be changed by
setting the environment variable R_RD4DVI.

The conversion to text help no longer requires groff.


rw0901
======

It is possible to install packages from any directory (set PKGDIR on
the make command) and to any directory (set RLIB on the make command).

RLIBS is no longer accepted for the library directory: use R_LIBS
(which has been preferred since 0.65.0).

The code to set the `cra' parameter for a windows() device (and hence
the base character size of symbols) is more robust.

The code handling Ctrl-like keys has been changed and ought to be more
robust (AltGr on Danish Windows NT used to misbehave.)

savePlot recognises filename="clipboard" (or "") for wmf plots.

The installer has always been version-specific and now tests it is
being used for the right version.


rw0900
======

We made a determined attempt to quote paths which might contain spaces,
and almost all cases work. Be careful with external unzip, pager and editor
programs that these do handle quoted paths.

Rterm can be interrupted by Ctrl-C as well as Ctrl-Break. Fast
typing should not give problems in interactive use.

Better formatting of math expressions in graphics labels, legends, ...
(but only if font is True Type since it seems not possible to get
per-char font metric information for raster fonts).

Support for GIF format bitmaps has been removed, but support for PNG, 
JPEG and BMP has been added. This can be done via the File menu on the
graphics window, savePlot() or dev.print to the new devices png(), bmp() 
and jpeg(), which can also be used directly.

PDF versions of the (draft) manuals are available in file rw0900d.zip
and install into rw0900/doc/manuals.  These can be read in Acrobat
Reader from the Manuals sub-menu of the Help menu provided they and
the reader (http://www.adobe.com) are installed.

The installer will install packages in the library directory if the
installation directory path ends in rw0900.

You can install packages by

    install.packages("/path/to/mypkg.zip", CRAN=NULL)



rw0651
======

New function savePlot() to save plots to wmf, gif or ps.

There is now support for help via compiled HTML files (as used by the
latest Microsoft products): set options(chmhelp=TRUE) to use this.
You will probably need Internet Explorer 4 or later installed to use
this, or you can install hhupd.exe from the windows/windows-NT/base/etc
directory on CRAN.

There is support for building Windows help files (as in Windows 95).
Set options(winhelp=TRUE) to make this your preferred help system.

Both compiled HTML files and Windows help are available for the
standard packages.

The new function update.packages() is supported if you have wget.exe
(a copy is in the windows/windows-NT/base/etc/wget.zip on CRAN) or
lynx.exe, from http://www.fdisk.com/doslynx/lynxport.htm.

On NT only, CPU times are returned by proc.time() (using a call to
GetProcessTimes).

Rotated text on a windows / win.* device is placed more accurately,
especially for non-multiples of 90 degrees.

A windows() device reports itself as `windows' not `X11'.

getenv() now returns all the environmental variables.

unlink() can now remove (empty) directories (but not using wildcard
specifications).

The complex LINPACK routines which were not included in the Unix
versions of R are now omitted here.

There is more support for (support of) ActiveX Automation via the
Rproxy.dll: see the file front-ends/readme.

As under Unix, .Renviron is first searched for in the working directory, 
then in the home directory. (It this case the home directory must
be given by the R_USER or HOME environmental variable.)

The sockets code is definitely working in this version, enough to support
source.url and friends.

options(pager="console") is set as the default if --ess is used (as it
works better with Emacs).

The rounding code has been re-written to be more accurate and to round
to even as documented.

The rw-FAQ is linked into the HTML help system.

We believe the problems with re-sizing windows (especially on Windows 9x)
have been solved.



rw0650
======

[ Because Guido Masarotto was ill for several weeks, rw0650 was only ever
pre-released. ]

There are many changes `under the skin' which are not reflected in
user-visible changes, but either improve performance or will allow
future enhancements.

The environment variables have been changed: R_HOME is now R's home
directory and R_USER is the HOME for the user which will be used by R
(and defaults to HOME, if set, then to ${HOMEDRIVE}${HOMEPATH}, if that
is set, then the working directory). (There are many other such
changes in R: for example RLIBS becomes R_LIBS, although for the time
being RLIBS is also recognised.)

Saving a plot as postscript from the device menu will produce a
portrait plot irrespective of the setting of ps.options().

Saving a plot as a metafile should be more reliable on machines which
report incorrect information on the size of the screen.

The new flag --no-environ suppresses reading .Renviron and is implied by
--vanilla.

When rterm is used non-interactively either --save or --no-save must be
specified: these is no longer a default of --no-save (for consistency 
with Unix).

More support for building R into other applications: see the examples
in the front-ends directory of the source distribution.

Interrupting by Esc or Ctrl-Break is handled internally by signals, so
the `User Break' response will no longer appear, but in rterm ^C will
be echoed.

There is limited support for `tilde-expansion': file paths such as
~/rest will be expanded to ${HOME}\rest if HOME is set, or to
${HOMEDRIVE}${HOMEPATH}\rest if those variables are set.

Using rterm either interactively or with --ess will be more responsive and
use much less CPU time when waiting for input.  Interruptions by Ctrl-Break
or (under --ess, for use by ESS) Ctrl-C should happen immediately and be 
handled correctly. [On NT: problems with Win 98 were corrected for rw0651.]

The installer can now install correctly in a top-level directory (e.g.
C:\), fixing a bug in the unzip code used.


rw0642
======

There are few Windows-specific enhancements: rw0642 (and R-0.64.2) is
a bug-fixing release.

If options(pager="console") then files are listed in the console
window, as happened prior to rw0640.

On request, we have enabled `pagerstyle = singlewindow' in MDI mode,
although we do not recommend this combination.

The file HOME\.Renviron is read (it was HOME\Renviron, and the
documentation used both names). Only the last line was successfully
processed in rw0641, but all lines are in this version.

unlink() on non-existent files no longer causes a crash.

The new function win.version() will report details of the run-time
Windows version, principally for use in bug.report().

bug.report() has a new argument wait: wait=FALSE gives a non-modal editor
screen.

Generally TAB will move between fields in dialog boxes, and return and
escape will work (selecting OK and Cancel) in the Change Directory
dialog box.

The installer will allow several packages to be selected, and will
install them in sequence. It should give more informative messages on
some error conditions. Usually return will select Next or Finish,
escape will select Cancel and B Back.

There is a new target `make check' for running the standard tests and 
checking the standard packages (as on Unix).

Saving the content of a graphic device as GIF should work again (under some
circumstances, it resulted in a white image in rw064[01]). 


rw0641
======

There is a choice of interface for Rgui:

o  SDI, single document interface. This is like the previous version,
   with separate windows for the console, graphics and pager(s).

o  MDI, multiple document interface.  Here the console, graphics and
   pagers are subwindows of one main `frame' window.

You can set your preference (and details of the MDI) in the Rconsole
file: this can also be overriden on the command line by --mdi or --sdi.

If you use multiple files in a single SDI pager, the (row) positions
are remembered and re-used when you switch views in the pager.

For MDI pagers, the pager size is chosen by the system, and only
multiple pagers are supported.

When pagers are re-sized the strategy is now to keep the middle line
in the middle.

The option `setwidthonresize' in Rconsole automatically generates an
internal call to options("width") if you resize the console and change
its width.  This is the default, but we suggest you do not resize
while R is outputting.

The console, pagers and graphics devices now have right-click popup
menus, and you can paste from a pager to the console directly.

There is a new console menu item to show a file in a pager. This is
intended to allow lines to be selected in an script file displayed in 
a pager and submitted to the R engine.

`Busy' cursors are used where appropriate: a cross-hair cursor is
used on a graphics device to indicate that locator() (or identify())
is in use.

The file HOME\.Renviron is now read. This can contain environment
variables in NAME=value form, one per line. This is useful for setting
R_VSIZE, R_NSIZE, RLIBS and R_PAPERSIZE, for example.

You can now paste in more to the console: the limit (which was 2048
chars) is now that of the clipboard. Pasting can take place whilst
the console is busy.

The command `make pkgcheck-pkgname' will do the equivalent of `R CMD
check', that is run all the examples in the help pages for that package.

unlink can now handle wildcards and a vector argument of length more than
one.

The inverse hyperbolic tangent functions  asinh acosh atanh  are now
available in this version.


rw0640
======

R-0.64 uses platform-independent code for file handling. Files are
displayed under a pager in a separate window rather than in the
console. 

Environment variables can be set as NAME=value on the command line,
including in a short-cut.

Content of the pager and of the Rgui's console can be printed
using File | Print.

The help, latex and example files can be stored in zip files to save
space; this is used for the base package.

The menus are enabled/disabled and check-marked correctly under NT.
We hope to have solved the 'rw0633 font dimension problem'  shown
under some NT versions.

read.fwf works if you have Perl installed.

help(, offline=TRUE) will work if you have latex installed and
customize RHOME/bin/helpPRINT.bat

The sockets code is compiled in, but we have not tested it.

system() has new arguments `invisible' and `minimized'.


rw0633
======

The beginnings of a FAQ (RHOME/rw-faq).

Programs can be launched from all shells: the full path to the
executable is not needed.

Configurable fonts in the graphics devices by the file Rdevga.

Workspaces are saved in XDR format, and so can be shared with most
Unix implementations of R.

Printer and metafile graphics devices (?win.print and ?win.metafile).

Consistent handling of start directory for dialogs and the working
directory across versions of Windows.

An improved and enhanced system() function (?system and ?shell). 

Windows-specific help files where necessary.

Better support for ESS.

Better support for the installation of pre-compiled packages
(?link.html.help)


rw0632
======

The NT copy to the clipboard bug has been fixed.

Help files use latin1 encoding (but, to see the difference, 
you must use a latin1 capable font; for this reason, now, as packed, 
the R console uses "Courier New"; if you don't like it, edit etc/Rconsole). 


rw0631
======

There are two executables, Rgui.exe and Rterm.exe.

NEW FEATURES

Will run from NT command line.

No `tricks' are needed for animated graphics.

The windows are much more responsive.

R commands can be interrupted by Esc.

Rterm allows batch mode operation and can also be run in
inferior-R-mode under NTEmacs.

There is a history mechanism for graphics plots.

Graphics can be copied to the clipboard.

Commands history is saved between session (only by Rgui.exe).

Saved images and user profile are called .RData and .Rprofile as under Unix
(before they were RData and Rprofile).


rw0630
======

- Minor adjustment to reflect changes in R-0.63.0 (options, example,...)

- Fixed a couple of minor bugs in the graphics device. 

- More control keys (some Emacs-like (crtl+a, crtl+e, crtl+k), and, by
popular demand, crtl+c and crtl-v for copy and paste); take a look at
the help/console menuitem.

- Added support for Cygwin B20 (target remains Mingw32,i.e, no Unix
emulation layer)

- Access of global variables in R.exe from a dll should work (all the
horrible name-mangling needed by `gnuwin32' - `var' in R.exe becames
`*__imp_var' in a dll - is done automatically).


rw0624
======

New features:

- The console can be configured (font, colours, dimensions).  No fancy
dialog (yet), but look at the rw0624/etc/Rconsole file.

- help.start() now is implemented. Of course, you need the html
documentation.

Bugs fixed (I hope):

- Alt+Gr problems on some European keyboards.

- Focus is 'always' given back to the console.

- Filters in the dialogs which ask a file-name.

- round(..) now works as documented.

- Some small modifications to the graphic device (position of text and
clipping of lines was sometimes not exact). In addition, I changed the
font to helvetica (for better consistency with the X11 device).


rw0623
======

A. News (with respect to rw0613)
--------------------------------

(a) I rewrote the console using a portable toolkit (GraphApp, see
http://www.cs.usyd.edu.au/~loki/graphapp). Now, output is buffered
until some input is required. In addition, there are some command
history support. For a mini help on the new console, use the
help/Console menuitem.

(b) I also rewrote the graphics device using GraphApp. Apart for the
redraw (which seems faster) the GraphApp device is +/- equal to the
one that you find in RJune. With respect to rw0613 the major
improvements are: (i) it is a R0.62.x device,i.e., it supports
multiple instances, resizing, copy,...(look to the dev.xxx functions);
(ii) it supports plotting math expression; (iii) there is a new item
in the menu which let to save the contents of the active device as a
gif file; (ii) arbitrary line patterns in any width are supported.

(c) Now, edit makes use of an external editor (the default one is
notepad), i.e., it works as under Unix.

(d) date() now works. In addition, proc.time(), and so
system.time(..), works (but don't expect too much, you will get only
the elapsed time).

(e) IEEE math (Inf, Nan,..).

(f) I used the GNU regex library. Hence all the
code is GPL'ed.

B. The new menubar
------------------
The menu bar contains the following item:

File 

Source R Code -> ask for a filename and then send to the
interpreter a source(filename) command.

Load Image -> ask for a filename and then send to the
interpreter a load(filename) command.

Save Image -> ask for a filename and then send to the
interpreter a save.image(filename) command.

Edit 

Copy Paste Copy and Paste Select All

Misc 

Kill current computation

List objects -> send to the interpreter a ls() command

Remove all objects -> ask for confirmation and then send to
the interpreter a rm(list=ls()) command

Graphics save as Postscript -> ask for a filename and then send to the
interpreter a dev.print(...) command

save as gif -> ask for a filename (extension must be
.gif) and then save the current plot as gif

Help 

Console -> mini help on the console

R language -> ask for a topic and then send to the interpreter a
help(topic) command

Apropos -> ask for a topic and then send to the interpreter a
apropos(topic) command

About 

Observe that some of the menu items just send to the interpreter a
command. This means that these items are disabled when the interpreter
is waiting for the completion of a previous command,i..e, when you
have the ''continuation'' prompt. On the other end, under normal
editing (prompt='>'), since the current line is saved and then
restored you can, for example, type part of a command, ask for some
help, and then complete your command.

C. Printing
-----------
To avoid questions: printing is not directly supported (yet).

To print the content of the console you must:
a) select the text;
b) copy it to the clipboard;
c) paste it in some word processor or editor which can print.

To obtain a good copy of your graphs you can:
a) save it as postscript and then print on a ps printer (or play with
it using ghostscript);
b) save it as a gif and then print it using one of the many programs
which support this format (image manipulation programs, word processors,
internet browsers,...).

If you give the focus to a graphic window, you can also copy it to
the clipboard using the alt+print keys. But this is the standard
Windows command and you will get also the window's decoration.  So
this is useful only to get a "draft" copy of the graph.  [however, I
find quite effective to open a word processor in which to paste
command, console output and graphs. Indeed this is the way I ask my
students to work (of course, they must also write comments!)].

[...]

H. Bugs (known) and misc. observations.
---------------------------------------
(a) As always, the English of this README.

(b) de() doesn't work anymore. If someone needs it, I can try to include
the old one (or try to write a portable version of it using GraphApp).

(c) edit(...) doesn't work properly under Win3.1/Win32s.

(d) system(...) is quite limited (popen under MsWindows is a
nightmare).

(d) To use this version under Win32s you need a recent version of
Win32s (I have only tested with the last one that can be found at
ftp://ftp.microsoft.com).

(e) Only the mouse can be used to select the text in the console.
