				Dear Emacs, please make this -*-Text-*- mode!

	This file covers NEWS up to the release of R-1.0.0.
	See 'NEWS.1' for subsequent changes.


	**************************************************
	*						 *
	*	       0.99 SERIES NEWS			 *
	*						 *
	**************************************************


		CHANGES IN R VERSION 0.99.0


NEW FEATURES

    o	The ``Introduction to R'' manual, in doc/manual.
	The ``Writing R Extensions'' manual is much enhanced for
	this release.

    o	The format for save/load has been changed. Workspaces and
	objects saved in earlier versions can be loaded into this
	version, but not conversely. Use save() or save.image() with
	argument oldstyle=TRUE to save in the old format if you need to.

    o	The header files for C code have been reorganised. The
	preferred header file for user code is now "R.h", and
	ancillary files such as Arith.h now need to be referred to
	as "R_ext/Arith.h". The `Writing R Extensions' manual now
	contains the beginnings of a description of the public API and
	how to use it.

    o	Many of the exported symbols have been remapped or hidden. This
	means that code using Rdefines.h or Rinternals.h or Mathlib.h
	will need to be re-compiled, and code using Applic.h may do
	so.

	Many packages will need to be re-installed for use with this
	release.

    o	The random number generation interface has changed, although
	saved .Random.seed's will work unchanged. The default
	generator is now Marsaglia's multicarry, and the Mersenne
	Twister GFSR and Knuth's Fibonacci subtraction are also
	available.  The type of normal generation can be selected by
	RNGkind() (and is encoded in .Random.seed).

	The new function set.seed() which uses a single integer to set
	the random number seeds is now the recommended way to do so.

	It is now possible for a user to plug-in a new RNG written
	in C: consult ?Random and ?Random-user for the details.

    o	All the DPQ {probability density quantile} functions have new
	arguments, "lower_tail = TRUE" and "log{_p} = FALSE".  This allows
	more precise results when values would be close to 0 or 1.

    o	R CMD Rd2dvi has new options --pdf, --title and --output.

    o	New fields Date, URL and Title in the DESCRIPTION file of
	packages. The Title field replaces the separate TITLE file of
	packages, which is no longer necessary.

    o	residuals.lm() has a "type" argument, as S does.

    o	The underlying code for nlm has been translated from Fortran
	to C and made re-entrant (changes contributed by Saikat DebRoy).

    o	optimize() can now be used recursively.

    o	New suite of optimization methods optim(), covering
	Nelder-Mead, BFGS quasi-Newton and conjugate-gradients methods
	for unconstrained minimization and maximization with and
	without derivatives.

	optim() also allows box constraints (interval bounds on
	individual variables) in its limited-memory BFGS option.

    o	R now compiles in the GNU version of regex, so regular
	expressions (grep, sub, gsub, regexpr, "pattern" in ls) are
	always available. The class of regular expressions supported
	is now slightly wider on some Unix platforms.

    o	package ctest (for classical tests) is now part of the base
	distribution, and also contains chisq.test, prop.test and
	t.test which previously were in package base. These three
	functions are auto-loaded from ctest.

    o	New utility `R CMD build' for building add-on packages along
	with some useful testing and cleaning up.

    o	Conversion of .Rd help files to text format is done in Perl,
	and no longer requires nroff.  This makes the conversion 8-bit
	clean and more accurate.

    o	Building help for a package now removes help files that no
	longer exist in the source.

    o	strsplit() now uses split regexps, and no longer insists on
	splitting into non-empty tokens.

    o	Long-named options with arguments such as `--vsize' now use the
	`--name=VALUE' form; the old `--name VALUE' is deprecated.
	The old-style command line options `-v' and `-n' are now defunct.

    o	par("cxy") { == par("cin")/par("pin") in user coordinates}
	for S compatibility.

    o	If R_PAPERSIZE is not specified otherwise, configure now tries
	to compute it by calling paperconf.

    o	The deprecated alternative RPROFILE is no longer accepted: use
	R_PROFILE instead.

    o	Added setequal() for set equality.

    o	First argument renamed to "package" for library(), require(),
	provide().

    o	model.frame() now accepts data= arguments that can be coerced to
	data frames.

    o	Help files can now contain \describe groups.

    o	Hyperlinks in help files can now use LaTeX special characters.

    o	rstandard() now also works for glm objects.

    o	glm drops 0-weight observations when fitting so that the
	output is compatible with lm.influence() and plot.lm().

    o	New function ftable() for creating and manipulating flat
	contingency tables.

    o	New function cutree() for cutting hclust trees in package
	mva.  New functions rect.hclust() and identify.hclust().

    o	Under Unix, the default editor is obtained from the environment
	variables EDITOR or VISUAL if either is set.

    o	New command line option `--gui' to specify the graphical user
	interface under Unix.  Currently, possible values are `X11' (the
	(default) and `GNOME', provided that GNOME support is available.
	Command line options `-g' and `--gnome' are defunct.

    o	power.t.test() and power.prop.test() functions added for power and
	sample size calculations.

    o	edit() is now generic and a new edit.data.frame() function
	calls up the spreadsheet data editor. This is still rather
	rudimentary, since the data editor really only knows about
	numeric and character vectors.

    o	Modifications to the data editor so that one can use ESC to
	quit a partial cell entry and entering an empty cell causes
	the element to be set to NA.

    o	prop.table() and margin.table() functions (these are *really* trivial).

    o	R INSTALL checks the Depends field of DESCRIPTION if the
	currently running version of R meets an R
	dependency. old.packages() reports only packages conforming
	to the current version of R. New function
	package.dependencies() for parsing and checking dependencies.

    o	options("expressions") now does something, and the evaluation
	depth is checked on all platforms (not just Macintosh). This
	will catch infinite recursions gracefully.

    o	The default number of cons cells (`nsize') is now 350k (it
	was 250k).  This reflects the added base code and packages,
	and increases memory usage by about 2Mb (on a 32-bit machine).

    o	Some simple multiple comparison procedures: p.adjust() for
	generic adjustment of a set of p values by variants of the
	Bonferroni method; pairwise.t.test, pairwise.wilcox.test,
	pairwise.prop.test for pairwise comparisons of grouped data
	and proportions.

    o	Error / warning calls with a long description of the call are
	split into two lines. (This helps avoid scrolling in the
	Windows GUI.)

    o	lapply() is now internal and substantially faster (7% overall
	speed-up on the tests for the base package).

    o	apply() no longer names the output dimensions unless FUN returns
	a result with names, and the same names for every result.

    o	contour() can (at last) label contours by level.

    o	persp() labels its axes.

    o	scan() and read.table() now have a dec= argument to set the
	decimal point character. If sep= is set, quoting of strings is
	now possible and follows the conventions for comma-separated
	files. This should make it easier to read the "continental
	CSV" format (fields separated by semicolon and using comma as
	decimal point).	 The set of quoting characters has also been
	made optional. Variants of read.table(), read.csv() and
	read.csv2() have been defined

    o	HDF5 support is gone from the R distribution, and provided by an
	add-on package available from CRAN.

    o	New function getOption() for retrieving the value of a single
	option.

    o	read.table.url() and related functions now use download.file,
	which has an extra "socket" method for direct HTTP socket
	connection. download.file has new option ``quiet''.

    o	pairs.default() has an oma argument to allow users to override
	the internal setting of that graphics parameter.

    o	princomp() in package mva allows the user to specify the
	covariance matrix (and hence use, e.g. cov.mve).


BUG FIXES

    o	svd(matrix(2,1,0)),
	arma0f(NULL), cancor(F,F) and prcomp(F[F]) no longer segfault.

    o	loess.smooth(F[F],F[F]) and supsmu(F[F],F[F]) no longer segfault.

    o	save(1, file = ""[F])  no longer segfaults.

    o	stop(list()) and warning(list()) no longer segfault.

    o	system(""[F]) and save(1, file = ""[F])	 no longer segfault.

    o	Overflow of the pointer protection stack is handled correctly

    o	predict.glm(, type="link", se.fit=T) works

    o	str() now works with Surv(.) objects from library(survival5).

    o	all.equal(-Inf, -1e5) now gives "Mean absolute difference: Inf"
	instead of "Mean relative  difference: NaN".

    o	strsplit fix broke copy.url.

    o	0 ^ -1 == Inf  and  min(NA, NaN) is now always NA

    o	R CMD xxx sets $R_HOME/bin to be first in PATH

    o	Added more warnings to update.packages & friends. New function
	old.packages for better control of update.packages.

    o	Adding matrices to data frames now happens column by column as
	documented, so character or logical matrices generate factor
	columns.

    o	Formulae containing interactions with the response were
	handled incorrectly by model.matrix, giving wrong answers or crashes.

    o	anova(lm(.)) with 0 weights now works.

    o	plot.lm(), dffits(), covratio() now do the right thing for weighted
	lm regression.

    o	formatC(as.integer(c(1,0,NA))) now works. PR#394, thanks to Jens O.-A.

    o	format.char(.) is much faster for long vector argument [Jens O.-A.]

    o	\enumerate now enumerates in text conversion of .Rd files.

    o	glm() no longer fails with names<- errors in cases where
	observations with fits on the mu.eta boundary have been dropped.

    o	Deviance residuals could be NaN instead of 0 by rounding error.

    o	shapiro.test(x) now gives better error messages (eg. x=rep(1,5))
	and doesn't print ANYTHING anymore (in some cases).

    o	mode(as.formula(paste("~", paste(1:50, collapse="+")))[2]) now works.

    o	glm() now handles cases with numerically 0 or 1 fitted values in
	binomial and numerically 0 in poisson correctly. (Previously
	these observations were dropped even though the variances were
	also numerically 0.)

    o	(-4 + 0i) ^ (1/2)  now gives 2i.

    o	system.time() now does sensible things in the non-HAVE_TIMES
	case, and that and proc.time() have better documentation.

    o	A couple of bugs in the data editor spreadsheet have been
	eliminated.

    o	Elapsed time in proc.time() is no longer rounded to whole
	seconds under Unix.

    o	Assigning character vectors to subsets of data frames now
	works correctly (it used to assign the numeric codes of factors).

    o	Extensive enhancements and corrections to the help pages.

    o	The possibility of buffer overruns during printing has been
	much reduced, and eliminated on systems with vsnprintf.


	**************************************************
	*						 *
	*	       0.90 SERIES NEWS			 *
	*						 *
	**************************************************


		CHANGES IN R VERSION 0.90.1


NEW FEATURES

    o	rect(.) has `lwd' argument.

    o	legend() has a `adj' argument and has been streamlined (and fixed up).

    o	`unname' convenience function [experimental data.frame behavior].

    o	`examples' sections have been added to the documentation
	for most of the data sets in the base library.

    o	update.packages & friends have new argument contriburl for
	incomplete CRAN mirrors. Package bundles such as VR can be
	directly installed both from the shell and from inside R.

    o	RLIBS is no longer accepted as well as R_LIBS (which has been
	the documented form since 0.65.0).

    o	demo(nlm) has examples of using analytical gradients and
	Hessians.

    o	.Platform$OS.type is standardized to be `unix', `mac' or `windows'

    o	setting cex in matplot(matrix(1:25,5), cex=1:5) now works

    o	ar.ols() has separate demean and intercept arguments, uses
	internal scaling for greater accuracy.

    o	xxxPR functions allow NCHAR=-1 for S compatibility.

    o	`Rcomplex' is preferred to `complex' (a future reserved word
	in C) for R complex objects passed to C.

    o	new function dir.create() for platform-independence.

    o	help.search() creates a database for faster searching later in
	the R session.

    o	density() allows for more kernels and has a new argument
	`give.Rkern' to access the relevant kernel property.

    o	multivariate methods for ar: "yule-walker" (now in C) and
	"burg" (new) contributed by Martyn Plummer.

    o	New data sets `HairEyeColor' (hair and eye color of statistics
	students), `Titanic' (survival of passengers on the Titanic),
	and `UCBAdmissions' (student admissions at UC Berkeley).


BUG FIXES

    o	Many help pages have been revised and enhanced.

    o	predict.glm() works again with type="link".

    o	subscripting arrays and matrices no longer loses the names of
	the dimnames vector.  Transpose also preserves the names.

    o	examples in help files containing \testonly are no longer
	(partially) duplicated.

    o	is.numeric() of a factor is now FALSE

    o	prevent a segfault in plotmath

    o	f <- get("function"); f(,); f(F,F)  now "ok" (PR#361).

    o	blank-line reject code in parse.dcf was wrong (Martyn Plummer)

    o	made filled.contour independent of pointsize. Make plot key
	wider so there's room for a title. Touchup example.

    o	font size fixups for the X11 driver (mainly)

    o	some.list[[NA]] is NULL, following S, rather than giving spurious
	error messages

    o	segfault when running out of heap

    o	segfault in rbind of a vector without names fixed. cbind, too.

    o	fixed symbol size problems with PostScript driver

    o	unique() & duplicated() only work for atomic vectors;
	unique(data.frame(""[F])) doesn't segfault anymore.

    o	get("attr<-")(""[0],""[0]) doesn't segfault anymore.

    o	blunder in do_memoryprofile, causing segfault on Alpha machines

    o	erroneous error message in coerceToSymbol

    o	partial workaround for workspace restore problems. This can
	happen if an environment on the search path is assigned to a
	variable which gets saved. The error "unresolved node during
	restore" is turned into a warning, allowing the rest of the
	workspace to be restored, but the variable contains an empty
	environment on reload.

    o	density(x) now works also when IQR(x) == 0.
	density(x, window=...) now works [S compatibility].

    o	prevent points from being plotted if pch, cex, or col are NA.
	Does not apply to bg on pch 21--25 (where NA means
	"transparent") because it would require fixes at the driver
	level.


		CHANGES IN R VERSION 0.90.0

NEW FEATURES

    o	packages splines (for regression smoothing splines or
	interpolating splines) and nls (nonlinear least squares) are
	part of the base distribution.

    o	New error handling using
	options ( error = expression(..) ,  warning.expr = ... ).
	REPLACING version 0.65.1's  options(error.halt = T/F)

    o	collected warnings before an error are no longer lost but
	are printed after the error message (unless the error makes
	this impossible).

    o	A couple of substantial graphics changes, esp. in the X11
	driver. The scaling of symbols is now linear in cex=, rather
	than being tied to the available font's size. The fonts on an
	X11 device also scale linearly with cex= insofar as your X
	server can do it. On systems with the scalable type 1
	PostScript fonts installed, this looks particularly nice. Note
	that the scaling is linear in the *diameter*, but quadratic in
	area. The distance between lines of margin text in the X11
	device is now proportional to the size given to
	x11(pointsize).


    o	abline(a,b) now (again) refers to transformed coordinates on
	plots with log-axes, so that abline(lm(log10(y)~log10(x)))
	(say) draws a best-fitting line on a log-log plot. The earlier
	convention (to draw a curve representing a line in original
	coordinates) is available using a new untf= argument.

    o	barplot.default() has new `axisnames' (and `sub') arguments, easily
	allowing suppression of bar labeling.

    o	cbind() and rbind() now actually do what deparse.level=1 implies:
	add column/row names based on the deparsed argument, provided it
	is a simple symbol. The behaviour is still hardcoded, though.

    o	gc() now reports the total sizes in Mb as well as numbers.

    o	New function help.search() for searching the names, titles,
	aliases, or keywords in the help system.

    o	image() allows x and y to specify either the boundaries or the
	midpoints of the cells. If the latter, the whole cells are
	drawn, rather than the outer cells being half-sized as previously.

    o	NULL extra arguments to model.frame() are now treated as missing
	(instead of an error).

    o	optimization with nlm() can use analytic gradients and Hessians
	if they are supplied.

    o	on.exit() allows add=TRUE.

    o	function parse.dcf() for parsing files in debian control file format
	(DESCRIPTION, CONTENTS, ...)

    o	predict.{g}lm has a type="terms" option, and residual.glm has
	type="partial" as a step towards plot.gam().

    o	New arguments to q() and quit() allow the exit status to be set
	and the execution of .Last() to be skipped.

    o	New function regexpr(), similar to grep but returns the position
	of the match in each string. (For S-PLUS compatibility.)

    o	scan() now supports complex numbers.

    o	New function sort.list, for S compatibility. (This has argument
	partial, but always sorts completely.)

    o	storage.mode<- can be used to set "single", and if setting
	anything other than "single" it removes the "Csingle" attribute.

    o	new function sunflowerplot().

    o	New function undoc() for listing undocumented objects.


    o	User's .Rprofile now executes in global environment

    o	All HTML pages now use the new style sheet doc/html/R.css

    o	html and text files have now a header line giving the name of
	the help file and the package. The description section now
	comes first.

    o	All the standard packages have DESCRIPTION files with
	"Priority: base", so installed.packages and
	package.description will work with them.

    o	The R-external manual which describes programming for the
	.Call and .External interfaces is in the doc/manual directory.

    o	New target `make pdf' in doc/manuals makes hyperlinked PDF
	documentation. (This is experimental for this release. See
	doc/manual/README for further details.)


    o	S.h now contains (via Rdefines.h) a MESSAGE macro, and
	Free NULLs the pointer, for compatibility with S3 (but not S4).

    o	New subroutine REALPR callable from Fortran (like DBLEPR but
	for real arguments): useful if as.single is in use.

    o	The cex= argument to plot() etc. can be a vector, like pch=.

    o	lty=0 now (again) makes lines invisible. Looks better for
	barplot label axis.

    o	zero.R tries to find the zero DLL in a system-independent way.


BUG FIXES

    o	apply should now work for all un-dimnamed arrays (PR#318).

    o	ar(..., demean=F) works more consistently across methods.

    o	barplot() had lower limits set at -0.01, causing trouble with
	small heights. Switch to relative scale. (Thanks to Matt Wiener)

    o	density() should work better with NAs and infinite values. See
	?density for the current definitions of how these are handled.

    o	diag(x) now works (as pre 0.65.1) for 1-d arrays.

    o	Stored-source was dropped by dump().

    o	expand.grid returns a data frame even for one arg.

    o	expand.grid(x) now also works for vector arguments x.

    o	factor(list()) or factor(character(0)) *is* now a factor
	with valid levels(.);
	ordered does NOT allow an `ordered' argument anymore
	and is now defined as trivial call to factor.

    o	help page for gc gives correct size of cons cells (20 bytes
	for 32-bit systems, 36 or more for 64-bit systems).

    o	gcinfo reports correct percentages of heap even for vsize > 200M.

    o	gl(6,3,12) and gl(6,3,2) now both work.

    o	Empty lists now deparse correctly.

    o	na.omit.ts and na.contiguous preserve classes.

    o	plot.factor {plot(<factor>)} now obeys axes=FALSE and xaxt="n".

    o	read.table(as.is = TRUE) would leave everything as character.
	Now it correctly tries to convert to numeric.

    o	require() now has the warn.conflicts argument of library().

    o	Fix problems in scan(flush = TRUE).

    o	scan() got confused by trailing whitespace.

    o	split(x,f) now works even when f is a factor with unused levels
	(PR#294).

    o	mosaicplot() has a formula interface and
	NULL instead of NA default args.

    o	stars() has "NULL" instead of "NA" defaults.

    o	str() is quite a bit nicer with factors.

    o	ts.union, cbind.ts, arithmetic on ts objects now allow
	non-integer frequencies.


    o	Switch to <tt> in HTML pages since Linux Netscape mangles
	Courier.

    o	When documentation is "compiled" (build-help), you now get warnings
	for multiple (conflicting) \alias{.} or \name{.}s.

    o	making the reference manual with `make dvi' copes better with
	isolatin1 characters (but not perfectly as these are not in
	standard TeX fonts).

    o	Rd.sty now uses standard LaTeX constructs like \bm for bold
	math and \url for URLs.


    o	Protect R_fopen against NULL filename in Unix.

    o	Math text in outer margins didn't work.

    o	Text clipping now works in the X11 device.

    o	Pixel rows sometimes got doubled in rotated text on the X11 device.

    o	par("yaxt") is now ok.

    o	Problems with realloc on some systems in AllocBuffer.

    o	Problem with formatReal on non-IEEE systems.

    o	demos/dynload/Makefile used macros that gave incorrect build
	on some non-GNU makes.

    o	Windows version copes better with paths with spaces in.

    o	R CMD check had a typo which made the final message fail.

    o	R_EOF redefined as -1, was causing trouble with isxxxx contructions.



	**************************************************
	*						 *
	*	       0.65 SERIES NEWS			 *
	*						 *
	**************************************************


		CHANGES IN R VERSION 0.65.1


NEW FEATURES

    o	.C, .Fortran. .Call and .External now have an argument PACKAGE
	to specify the shared library to be used for the symbol. See
	?Foreign. Package writers are encouraged to use this.

    o	On startup (unless --no-environ), first .Renviron is looked for in
	the current directory, and then in $HOME/ (= ~/ ).

    o	New options(error.halt = FALSE) (default is TRUE) allows
	continuation after an error in batch processing.

    o	In graphics, lty has now 6 instead of 4 predefined line types.

    o	as.hclust.twins() in package mva to convert (and plot)
	objects from agnes() and daisy() of package cluster.

    o	R INSTALL now can directly install pkg_version.tar.gz files
	as obtained from CRAN. New function update.packages()
	& friends for automatically downloading packages from CRAN and
	install them on the fly (on Unix and Windows).

    o	New function commandArgs() to record the command-line used.

    o	New arguments `local' and `now' to dyn.load.

    o	diag(x) now keeps names when appropriate and barfs when x is an array.

    o	functions source.url, url.show, read.table.url, scan.url to read
	from an http server instead of a file.

    o	grid() gets useful defaults: grid lines drawn at tick marks.

    o	set operations union(), intersect(), setdiff() and is.element().

    o	New function stars() for star plots and segment diagrams of
	multivariate data.

    o	Version info now in the top-level file `VERSION'.

    o	barplot has a "plot = TRUE" argument and now returns locations of
	all bars even when "beside = TRUE".

    o	hist has an "nclass" argument purely for S compatibility.

    o	Character strings can now, with most compilers, be passed
	on and from Fortran. See ?Foreign for details.

    o	Functions as.single and single now have the effect with
	.C and .Fortran of passing a numeric argument as float/REAL
	rather than as double/DOUBLE PRECISION, by setting the
	attribute "Csingle". See ?Foreign for details.

    o	Comparison of strings uses the current locale on systems where
	this is available, and so is always consistent with the ordering
	used by sort().

    o	sapply	has a new argument USE.NAMES=TRUE  and now returns a named
	result when its input was a character.

    o	plot.stepfun  has new arguments	 lty and lwd.

    o	x labels in boxplot now handled differently, so that math
	expressions are allowed.

    o	postscript() argument `onefile' now does something, and there
	is a new paper type `special' and new argument `pagecentre'.
	See ?postscript for details.

    o	Experimental function dev2bitmap() to copy to a bitmap graphics format.


BUG FIXES

    o	centering in text() will be more accurate, particularly on devices
	with full font metric information (postscript, x11, not windows).

    o	arguments after --no-readline in the Unix version were ignored.

    o	couldn't set attributes in hashed environments.

    o	[<-.data.frame mishandled dfr[1] <- 1 (forgotten drop=FALSE)

    o	sys.on.exit didn't work

    o	sys.parent didn't quite work either for n >= 2.

    o	par("mfg") was wrong, par(mfg=) switched to down columns. Now
	par(mfrow/mfcol = c(nr, nc)) followed by par(mfg=c(i,j)) is
	the preferred style.

    o	plot( <aov.object> ) failed after 2nd plot, PR#279

    o	Several patches for systems with long != int.

    o	approx failed if inputs contained NAs.

    o	weighted lm fits with 1 diml x failed if any weight was zero.

    o	lm.influence failed when there were undetermined coefficients, PR#280.

    o	problem with function()... inside saved functions because arg count
	increased to accommodate stored source. (Incorrect number of
	arguments to "lambda")

    o	improvements to generation of HTML help files: should work
	better on viewers other than Netscape.

    o	stl in package ts could conflict with package leaps: the Fortran
	symbols have been changed.

    o	help page for factor is improved and corrected.

    o	na.omit.ts and na.contiguous now preserve time-series attributes.

    o	more automatic testing ("make check") using options(error.halt=FALSE)
	led to the elimination of dozens (!) of seg.fault possibilities.

    o	family quasi handles zero observations with var=mu^2 more correctly.

    o	dynamically-loaded libraries are searched last-loaded first, as
	documented (under Unix it used to be first-loaded first).

    o	rowsum failed with a matrix and a single group (drop=FALSE needed).

    o	deriv(y ~ <expr>(x)) now works as well as  deriv(~ <expr>(x)).

    o	qr over-estimated ranks in some degenerate cases.
	qr did not work correctly if n < p and the first n cols were
	rank-deficient.

    o	str() wouldn't work quite right for named characters;  doesn't quote
	symbols anymore.

    o	Colour conversion (rgb, gray, hsv) truncated doubles and so
	gave machine-dependent results on the examples. It now rounds.

    o	cat() now admits again that it can't handle lists instead of
	"random" segfaulting.

    o	More accurate rounding (including rounding to even) on platforms
	without rint (e.g. Windows).

    o	qgeom() is now left-continuous with a tolerance, and so the
	example on the help page will be platform-independent.

    o	pretty() has been changed to use tolerance around integers and
	so will be more platform-independent. The exact output has
	probably changed on all platforms for some input.

    o	image() & filled.contour() now work for 1x1 matrices
	and with constant z values.


		CHANGES IN R VERSION 0.65.0

NEW FEATURES

    o	A first step in improving performance has been made.
	Attached objects, libraries etc are now hashed; performance
	gains will be particularly apparent if large packages are in use.

    o	First version of package ts for time-series analysis.
	This has fairly complete S-PLUS compatibility, but more features
	are planned. See library(help=ts) for details.

    o	warnings can be collected (options(warn=0), the default), printed
	immediately (options(warn=1)) or turned into errors (options(warn=2)).
	As a consequence, all warnings and errors now are printed followed
	by a newline, if one is not supplied. (This should improve the
	S compatibility of the use of PROBLEM ... in compiled code.)



    o	All R environment variables are now of the form `R_xxx'.  In
	particular, `RHOME', `RLIBS' and `RPROFILE' are now called
	`R_HOME', `R_LIBS', and `R_PROFILE'.

    o	The handling of q()/quit()/EOF has been changed, with a new option
	"default".  In interactive use this asks unless --save or --no-save
	has been specified: if these are specified they set the default.

    o	Limited capability for tilde expansion of file names even without
	readline (on Unix, and on Windows).

    o	New environment variables `R_HISTFILE' and `R_HISTSIZE' for the
	name and size of the history file.

    o	Attempting to restore (at startup) too large a .RData is now
	a fatal error.

    o	The loading of shared library on Unix now uses RTLD_NOW not
	RTLD_LAZY.  This means that all symbols must be resolvable
	when the library is loaded, and R will not terminate later
	when a missing symbol is called.  Code which had missing symbols
	(including some packages) will need to be re-compiled.



    o	New generic function all.equal();
	most useful for numerical comparisons `up to rounding errors'.

    o	New function boxplot.formula() as a formula interface to boxplots.

    o	New functions getwd() and setwd() for getting and setting the R
	working directory, basename() and dirname() for manipulating paths.

    o	Function locator(, type=) is implemented to plot points or
	draw lines interactively.

    o	Functions new.env() to create empty environment and local() to
	allow local evaluation of expressions, with various useful
	idiomatic uses.

    o	Convenience functions parent.frame() and eval.parent().



    o	A new scheme for keeping source code with user-defined
	functions has been implemented. In particular, comments
	will no longer move about or disappear. The flip side of the
	coin is that you can no longer rely on R to indent your
	code for you. The stored-source facility can be turned
	off with options(keep.source=FALSE), and for an individual
	function by deleting the "source" attribute.

	If the source attribute is absent, the function will be
	deparsed for editing or printing, but any comments will be
	lost.

    o	expressions have gained semantics that are closer to
	those of S. They don't get evaluated except when explicitly
	specified. Example:

	e <- expression(x); e[[1]] <- expression(123); eval(e)

	now gives expression(123), not 123. This fixes some problems
	with expressions in the list argument to do.call().



    o	contrast() no longer drops colnames for 1DF contrasts.
	Consequentially, the labels of regression coefficients for binary
	factors contain level names (again ...).

    o	na.omit() and na.fail() are now generic.

    o	plot.lm() has more options and now does 4 plots by default, should
	also be okay for "glm" object; all thanks to John Maindonald.

    o	If the dimnames of a table are themselves named, then their names
	are used to label the respective dimensions in tabular output.

    o	chisq.test() now optionally computes the p-value by Monte Carlo
	simulation (in the standard case of a 2-d contigency table).

    o	source() has a new argument `chdir' for changing the working
	directory to that of the file being sourced when evaluating.

    o	If data() loads an R source file, it now changes the working
	directory (to that containing the file) when evaluating.

    o	Interpret strings NaN and Inf in character to numeric conversions
	(and thereby in read.table)

    o	The presence of an object `.conflicts.OK' in a package suppresses
	conflict checking in library() for that package.

    o	uniroot() can now be used recursively.

    o	hdf5{read|write} now allow more kinds of attributes and add support
	for HDF5 version 1.2 (or newer)	thanks to Marcus G. Daniels.
	Configure checks for HDF5 1.2 availability, older versions will
	no longer work.



BUG FIXES

    o	x ^ y  gives proper results when x or y are infinite.

    o	The semantics of <<- have been corrected.  The search for
	a variable binding to modify now begins one level "up" from
	the current one.   Thus S and R semantics in "non-closure"
	functions will be identical.

    o	.Last() is called when terminating with q() (not just with EOF).

    o	abline() now understands the "lwd" graphics parameter if it
	is supplied as an inline argument.

    o	axis() now sorts `labels' when it sorts `at'.

    o	Some small changes have made in the axis drawing code to
	ensure that tick-mark label alignment is correct for
	non-default values of the "las" parameter.

    o	Improved error message from check.options().

    o	cm.colors(n) now doesn't append silly "v=1"; works for n=0, n=1.

    o	cooks.distance() now also works for "glm" objects;
	deviance.lm() now ok for the case of weights.

    o	date() doesn't return a final "\n" (again ...).

    o	diag() and diag<- now handle correctly matrices with zero rows or cols.

    o	help([<-.factor) (etc) work again.

    o	is.recursive(list(.)) is now TRUE [PR#221].

    o	log(0) gives -Inf on all architectures.

    o	When persp() was the first graphics command given to R it gave
	the error "plot.new() has not been called yet".	 This no
	longer happens.

    o	pgamma() gave 0 or 1 for extreme arguments too soon.

    o	plot(<function>, log="x") doesn't give a silly warning any more.

    o	The internals of postscript() have been changed so that line
	textures (dotted dashed etc) look better.  The use of the
	PostScript "initclip" operator has been removed so that we
	can(?) really claim eps compliance.

    o	revsort() misbehaved if n<=1, causing sample(1,1,,1) to
	segfault

    o	seq(along = v) { and seq(v) when length(v) > 1 } now returns
	a result of mode "integer".

    o	split.default() now uses subscripting for x with a non-null
	class, this preserves, e.g., the class of factors

    o	substr/substring(), deparse(), dput(), dump(), print()
	will work for arbitrarily long strings.

    o	which(x) failed when x had names and contained NAs.

    o	Default editor files (e.g. from fix()) are now removed at termination.

    o	Typos in NegBinomial.Rd (Negative Binomial distrib), thanks to Ch. Gu.

    o	a clipping problem for plots when there non-zero outer margins
	has been fixed.	 This problem used to affect coplot() and pairs().

    o	get("zzz", mode="xxx") missed promise objects.

    o	match.fun failed when a data frame was attached containing a
	"length" variable (e.g.)


	**************************************************
	*						 *
	*	       0.64 SERIES NEWS			 *
	*						 *
	**************************************************


		CHANGES IN R VERSION 0.64.2


NEW FEATURES

    o	new target for R installation testing :	 make strict-tests.

    o	symnum(x) now nicely codes logical x.

    o	convolve() has a new type = c("circular", "open", "filter")
	argument allowing more than the only circular convolution.

    o	par(xpd) now has three settings:  FALSE (clip to plot region),
	TRUE (clip to figure region), or NA (clip to device region).

    o	zapsmall(x) works for complex x.

    o	new global variable R.version.string (for plots & reports).
	Deprecated version & Version for new  R.version & R.Version.

    o	R CMD Rd2dvi has builtin "Usage" help and works for multiple files.
	Useful for automatic reference manual of a package.


BUG FIXES

    o	power() is now fully implemented and documented.

    o	A couple of problems with group generic operations.

    o	A bug which meant that it was not possible to add elements
	to zero length lists in the obvious way has been fixed.
		x <- list(); x[[1]] <- 10
		x <- list(); x[["a"]] <- 11
	both now work.

    o	save.image() ignored dot-names. (esp. .First())

    o	lab= argument to plot() misinterpreted by axis() via ... passing

    o	NULL labels in text() caused segfault

    o	matrix(f,...) with f a factor now coerces to character

    o	documentation errors for substitute and is.vector, minor fixups for
	trig and nlm

    o	Background colours are set properly on X11 devices with
	colortype="pseudo": sometimes they were not allocated separately.

    o	C() works (again?) for a single argument.

    o	is.na() didn't work properly for "list" arguments.

    o	symnum() sometimes failed with arrays of rank >= 3.

    o	in some cases one could get nonblack color instead of
	black on 2nd x11() window.

    o	influence.measures(.) $ is.influential was wrong on the
	cooks.distance.

    o	printing of complex NaN/Inf was wrong as well.

    o	printing of complex named vectors had a wrong initial space.

    o	allow trailing space in character->numeric coercion

    o	library() gave wrong "masked" warnings in some cases.

    o	par(xpd) semantics were not compatible with S.

    o	rect() output was not clipped in PostScript.

    o	par(pin=c(width, height)) was behaving as par(pin=c(width, width)).

    o	Non-blank separated data files didn't have their 1st field
	handled properly.

    o	"aux" directory moved to "tools" to avoid difficulties on
	Windows.

    o	structure() clobbered factors with missing levels.

    o	pmatch() misbehaved on duplicate matches.

    o	R CMD Rd2dvi <file.Rd> works again.

    o	logical binops tried to set time series parameters before dimensions.

    o	upped the BUFSIZE in model.c (NOT proper long-term solution).

    o	dput(), dump() and deparse()  now always use DBL_DIG (=15) digits
	for numeric formatting.

    o	chull() now works for vertical borders, such as in chull(c(1,1,2),3:1).


		CHANGES IN R VERSION 0.64.1

NEW FEATURES

    o	barplot() and boxplot() are now generic

    o	relevel function to reorder levels in factors.

    o	contr.treatment now has a base= argument for selecting the
	baseline group.

    o	New command line option `--no-environ' (under Unix) to prevent
	sourcing the `~/.Renviron' file.  Implied by `--vanilla'.

    o	Packages can now have a configure script.  If a file `configure'
	is found it is executed before anything else is done by R
	INSTALL.

    o	If HTML help files are asked for but not available, text help
	is used.

    o	HTML help file conversion reports unsatisified \link{..}s.

    o	`vsize' and `nsize' can be set by the environment variables
	R_VSIZE and R_NSIZE respectively, perhaps most conveniently from
	`~/.Renviron' under Unix or Windows.  Command-line settings will
	take precedence.

	The defaults have been increased to 6M and 250k.

    o	zip files can be used for storing help and example files. See
	the help files for "help" and "example" for details.

    o	New submission method "none" (for not sending email) in
	bug.report().

    o	`R CMD check' can now also be used for installed packages without
	the corresponding sources.

    o	The sources for the Windows port are included in src/gnuwin32.
	See src/gnuwin32/readme.

BUG FIXES

    o	deparser left off empty parentheses on e.g. (function(x) x)()

    o	cat() now works on "name" objects

    o	forgot to set jump buffer in return context in one case

    o	parser dropped off tagged missing args on function calls ( f(a=) )

    o	relops tried to set time series parameters before dimensions

    o	arithmetic tried to set time series parameters before dimensions

    o	mvfft fixes (from Martyn Plummer) - not working with vectors and
	segfault problem.

    o	Rephrased error message on invalid assignment target.

    o	ifelse() now evaluates yes/no only if needed

    o	PROTECT'ed some memory in NewExtractNames that was getting overwritten
	during garbage collection.

    o	Crossing factors (`:') works again.

    o	terms.formula used to choke on terms more than 60 characters long

    o	is.nan() should now work correctly on new/old-style lists.

    o	x[[i]] did not work correctly for negative subscripts i.

    o	as.list() didn't work for expressions

    o	x[[i]] <- quote(a) (x generic vector) didn't work

    o	for method functions: many argument name changes, add ... where
	needed, for consistency with the generic function.

    o	example() will allow (again) aliased topic names.

    o	HTML help file conversions will find hyperlinks in the main
	library as well as the current library. Links containing `<'
	or `>' now work properly.

    o	Rdconv conversion of \section{}{}s to Sd corrected.

    o	ppois rounded non-integer `q', should truncate.

    o	pnbinom was wrong for non-integer `q'.

    o	dbinom, dgeom, dnbinom, dpois give 0 with a warning for
	non-integer arguments.

    o	load / save / data allow unlimited string sizes.

    o	strsplit() allows unlimited string size.

    o	eigen() now should work (again) in all cases.

    o	is.nan() fixed to work (again) in architectures with
	"unspecified" internal isnan().


		CHANGES IN R VERSION 0.64.0

NEW FEATURES

    o	Files BUGS and FAQ are now included with distribution and
	various "front matter" files have been cleaned up.

    o	readline has now an argument  prompt = ""

    o	coplot() now labels levels when conditioning variable is factor
	(John Maindonald).

    o	A new function filled.contour() has been added.	 It produces
	a variant of contour plots where the area between contours
	is filled with a solid colour.	The function (currently)
	uses the layout() function and so is restricted to a full
	page display.

    o	The function terrain.colors() has been modified to remove a
	visual discontinuity (at yellow).  In addition, a function
	cm.colors() which implements a Cleveland-style cyan-magenta
	palette has been added.

    o	Primitive function .External() to call dynamically loaded
	`internal'-style functions (code from Jean Meloche).

    o	Function page() to view an R object in a pager.

    o	Support for handling embedded '\n's in text strings
	handed to low-level graphics functions has been added.
	Some changes to the PostScript graphics driver were
	needed to support this, so there may some minor change
	in the appearance of plots produced in PostScript.

    o	The LaTeX documentation is now split into 2 parts: the (currently
	almost non-existent) manual and a reference index.
	Manual: new section on loading C++ code.

    o	[EXPERIMENTAL] Gnome support added. Use ./configure --with-gnome
	to try it, but don't expect too much yet.

    o	HDF5 support improved. Still not perfect, though.

    o	The X11 graphics driver can now use a variety of strategies
	for handing color.  This means that it is now possible to
	use black and white or grayscale graphics on color displays.
	There are two strategies for handing color on pseudocolor
	displays.  The original "allocate-colors-until-they-run-out"
	strategy has been supplemented by one which allocates a
	color cube at startup and approximates requested colors
	by those in the cube.  On truecolor displays, there is no
	limit on the number of colors which can be displayed and
	you get exactly the color you request.	(Note that
	Directcolor and staticcolor displays are not supported yet).

    o	The persp() function now allows shading of the rendered	surface
	using a simple lighting model.

    o	Many functions providing an interface to the operating system
	have been made "platform independent".	See the manual entries
	for "file", "list.files" and "file.show" for details of the new
	interface.  The system.file() interface has been changed.

    o	There is a new function "eval.with.vis" which behaves exactly
	like "eval", but which returns both the result of the evaluation
	an a logical value indicating whether the value is ``visible''.
	This has been used to replace some ad-hoc tests for whether
	value should be printed or not in "source".  As a consequence,
	the "example" and "demo" functions no longer print invisible
	values when the example script is run.

    o	Index files in data directories in packages should be `00Index'
	not `index.doc'.

    o	Function interaction() to compute factor interactions.

    o	load() can load to specific environments.

    o	Sockets interface: make/read/write/close.socket()

    o	Function chull() for planar convex hulls

    o	pairs.formula() allows formula notations for scatter plot matrix.

    o	new dataset co2.

    o	documentation for datasets mtcars, plants, pressure, randu and
	sleep.

    o	the sunspots dataset is now monthly rather than annual.

BUG FIXES

    o	strsplit(), scan() and friends use a much larger char buffer
	 (still fixed size; this will change again)

    o	ts() allows a data-frame argument `data'.

    o	anova.lm handles singular models better, and deparses responses.

    o	dump() now uses digits=12 rather than the current setting.

    o	tabulate ignores entries beyond nbins rather than core dumps.

    o	?.C documents what C/Fortran types R objects correspond to
	in foreign function calls, which is not what everyone thought.

    o	changed long to int in several .C calls to follow the above rules.

    o	rbind(x1,x2) now does not lose dimnames when xi are
	character or complex.

    o	readline() accidentally inherited menu()'s prompt.

    o	.C() and .Fortran() now correctly report that there might be
	NaN/Infs, not just NAs, unless NAOK=TRUE.

    o	Resizing an inactive graphics window to an invalid size left
	that window active and produced a spurious prompt and newline
	in the console window.	This no longer happens.

    o	poly() rescales x to increase accuracy

    o	apply() preserves names in yet another case [-> new example].

    o	phyper() now works for larger arguments than before.

    o	Missing values didn't work in log plot

    o	outer() doesn't produce all-empty dimnames any more

    o	quantile.default() works when `probs' has zero length

    o	example() now works again in all cases [AnIndex spaces].

    o	typos fixed in nlm() message, glm help

    o	pt() now works better for extreme `df' arguments and gives
	at least an approximate answer for ncp > 37.6. __more to change__

    o	fixed some glitches with formatC() and its docs.

    o	several fixes in *.c code to make -Wall happy

    o	curve() [and plot.function()] now use proper `x' values with log="x";
	`type = "."' now works with curve() and plot.function()

    o	zapped old windows files since they didn't build any more.
	The sources for the later gnuwin32 version are expected to
	appear here for 0.64.1. The #ifdef Win32's here are for that
	version.


	**************************************************
	*						 *
	*	       0.63 SERIES NEWS			 *
	*						 *
	**************************************************


		CHANGES IN R VERSION 0.63.3

NEW FEATURES

    o	get() and assign() allow position in search list to be a
	character string. (e.g. get("delete.response","package:base")

    o	HTML search now works for all packages (after new installation).

    o	R INSTALL now also copies DESCRIPTION file to target dir.

    o	offsets should work with lm as well as with glm now

    o	range() is now in the Summary group, trunc() back in the Math
	group.

    o	Under Unix, R-specific environment variables can now be kept/set
	in `~/.Renviron'.

    o	New options `latexcmd' and `dvipscmd' for specifying the locations
	of LaTeX and dvips; corresponding environment variables renamed to
	`R_LATEXCMD' and `R_DVIPSCMD'.

    o	--vsize & --nsize now both give size in "single units"
	(bytes/cons cells) with possible
	suffixes "M" (Mega), "K"ilo (1024) and "k"ilo(1000).

    o	[pdqr]negbin() now also work with non-integer 'size' [by Ben Bolker].

    o	New standard package `lqs' for resistant regression and
	covariance estimation, contributed by Brian Ripley.

    o	new functions match.fun() and kronecker() [by Jonathan Rougier]

    o	par(las = 3) is a new option.

    o	new function jitter()  [slightly more useful than S's].

BUG FIXES

    o	system(command, intern=FALSE, ignore.errors=FALSE)
	changed 1st & 3rd argument names and is better documented.

    o	"/Font5 /Symbol findfont definefont" confused some printers

    o	Bounding box rotated 90 deg for landscape (shouldn't be)

    o	Legend skipped symbol for pch=0

    o	compilation on non-Intel Linux systems no longer looks for __setfpucw

    o	a %% b -- is now periodic instead of symmetric; more S compatible.

    o	locator(n=512) -- default: MANY points, not just one.

    o	qqnorm() uses ppoints() and returns list with x sorted along y.

    o	plot.formula now allows ylab to be set

    o	plotmath had trouble with paste()'ing expressions

    o	plotting math expressions now also works for objects of mode
	"call" (in particular on the result of substitute())

    o	locator() on log axes: value antilogged twice

    o	(a real oldie - and trival too) is.recursive now TRUE for
	expressions

    o	sanitised delete.response

    o	x[["a",]] could crash R

    o	strwidth() crashed R if no device open

    o	predict inconsistencies with offsets straightened out

    o	tapply goofed when FUN returned named scalar

    o	[.factor now retains contrasts attrib.

    o	hist() had trouble with plotting math

    o	HTML indices get only built when installing a package to RHOME

    o	subscripting with a length zero logical no longer bombs.

    o	as.ordered(NULL) now returns an "ordered" object.

    o	--debugger .. now gives a warning if other command line args are used

    o	pt(t, df, ncp) now also works for bigger ncp's

    o	apply(a,d, fun) now passes vectors (rank 1 arrays) to fun.

    o	model.frame() with subset and only one column fixed

    o	boxplot(<data.frame>) now works again.

    o	dyn.load(..) failing gives more informative error message.

    o	Ops.factor:  not error, but a warning + NAs

    o	bug.report() keeps report file if can't be e-mailed

    o	Ops.data.frame :  things like  d.fr < a	  now return a matrix

    o	data.frame():  duplicated row.names now give a warning when dropped.

    o	boxplot(.., ylim=..) or (.., axes=..)  gave erronous warning

    o	glm had wrong init code for models with offsets. Also fixed
	so that linear predictor includes offset, also when predicting.

    o	predict.glm didn't work with se=T

    o	backsolve(), qr.solve... now return a vector when x (or y) is a vector.

    o	string tags now converted to symbols and strange symbolic
	tags print as strings, cf. e<-quote(c(F=2, "tail area" = .5)), etc.

    o	row.names(.) <- val  doesn't allow duplicated values anymore.

    o	library(mva)'s dist() now works with both "euclidean" & "euclidian"

    o	revised curve function to avoid using grep patterns that caused
	problems under Solaris 2.6

    o	coplot() now has 'number' and 'overlap' arguments, and should work
	in more situations. [by John Maindonald and MM].

    o	save(..ascii=TRUE) now uses "full precision" for numerics.

    o	as.array() preserves names()

    o	outer() works for general array args and preserves (dim)names.

    o	print.factor and print.ordered now return their args invisibly.


		CHANGES IN R VERSION 0.63.2

NEW FEATURES

    o	sink() has new `append' argument.

    o	new function rle().

    o	plot(.) and  curve(.) also accept a function as first argument.
	new `plot.function'.

    o	new function loglin().

    o	pretty() has new arguments and now better "obeys" its `n' arg.
	Internal GPretty() [implicitly used by	axis(.., at = NULL,..)
	now uses pretty.

    o	new generic function aggregate() with methods for data frames
	and time series.

    o	data set `euro' with Euro conversion rates.

BUG FIXES

    o	model.frame(,subset=) no longer loses contrasts

    o	`make install' copied the R shell script a second time without
	getting RHOME right (thus also breaking R CMD check).  Fixed.

    o	help() after help.start() did not work if topic was not equal
	to filename (e.g. rnorm is found in Normal.html)

    o	fix the 0.63.1 fix for abbreviate(.);  improved doc.

    o	predict.mlm(.) couldn't have worked with `newdata'.

    o	model.frame/na.omit bug for matrices and Surv objects.

    o	mean( <data.frame> ) now doesn't return sum(.) anymore.

    o	str(.) doesn't give extraneous "..." in rare cases anymore.

    o	Added documentation for group methods ("Math", "Ops","Summary").

    o	R_PAPERSIZE is used for Rd2dvi and at configure time for the
	`make dvi' parts.

    o	hist(i) now also works for e.g., i = -1, 0, or 1.

    o	range() now works on dataframes (uses c(..., recursive=T))

    o	pretty(.) does not loop infinitely anymore in very extreme cases.

    o	math functions should work better on dataframes now

    o	plot(.., type = 'h', log = 'y')	 now works ...

    o	plot.factor(x, y, ...) of two factors now makes
	barplot(table(y,x), ...)

    o	use object$prior.weights in add1.glm, drop1.glm (Brian Ripley)

    o	rnorm(1,mean=m,sd=0) returns m, not NaN (Ben Bolker)

    o	runif(n, a,a) now returns  rep(a,n) instead of NaNs.


		CHANGES IN R VERSION 0.63.1

NEW FEATURES

    o	new function mosaicplot().

    o	xy.coords(.) has a  "recycle = FALSE" argument,	 used in text().

    o	RNGtype() allows to choose different Random Number Generators.
		__EXPERIMENTAL__

    o	print.default(.) now also works with a `right = TRUE' argument.
	{{ print.matrix(.) is bound to become deprecated... }}

    o	new help page `Memory' on the usage of command line options
	--vsize and --nsize. Error message if R runs out of memory
	points to help(Memory).

    o	rowsum() and improved na.omit() added from survival4

    o	backsolve(.) has new arguments "upper.tri = TRUE, transpose = FALSE"

    o	hist() has new "right = TRUE" argument;
	"right = FALSE" gives  [a,b) intervals

    o	help() has "htmlhelp" argument, allowing to suppress htmlhelp after
	help.start().  This is desired for ESS.

    o	quantile(.) has an "names = TRUE" argument for speed.
	It is much better documented now.


BUG FIXES

    o	build-help --dosnames should now also work for text help,
	latex and examples.

    o	seq() should work better now (fuzz-factor 1e-7 inserted)

    o	multiple arguments to return caused value to be a pairlist

    o	data.frame choked on long names from deparse()

    o	data.edit now works (dataedit doesn't need pairlist()s anymore)

    o	as.pairlist(NULL) is ok

    o	ts(1:5, start=2, end=4) now work.  Further plot(ts(..), ts(..))

    o	eigen() returns $vectors in any case [S compat].

    o	apply(cbind(1,1:9, 2, quantile) doesn't drop quantile names anymore

    o	array(1, dim=(1:3)[c(F,F,F)]) is now valid == array(1,NULL) == c(1);
	the same for array(a,d, list())

    o	fix problem with step() and offsets

    o	drop attributes on matrix subsetting

    o	kappa(.) now works [dtrco now in load table (ROUTINES)].

    o	pmin() and pmax() now preserve attributes.

    o	handle null models arising in drop1(), step, etc.

    o	partial matching problem with $ indexing

    o	matplot(.) works with lwd (vectors)

    o	par("cex.axis") now has the desired effect...

    o	which(.) now omits NAs in its argument.

    o	rbind.data.frame caused character-to-factor coercion a bit too often

    o	couple of messups in dotplot

    o	z[[1]] <- ~x probl fixed as suggested by J.Lindsey

    o	do_modelframe could lose contrast attributes

    o	"make check" needed standardisation of locale

    o	unlist(...,recursive=F) got names wrong

    o	abbreviate(.) does not anymore return random garbage in some
	cases [by Guido M.]


		CHANGES IN R VERSION 0.63

NEW FEATURES

    o	library(... , warn.conflicts = TRUE)
	now prints all conflicts arising from attaching the given package.

    o	new  .Platform	variable  for better modularizing
	platform dependence. __This_is_"beta"_and_bound_to_be_changed___

    o	new arguments to colnames(..) and
	rownames(x, do.NULL = TRUE, prefix = "row").
			   _
    o	par(bty = "]") for _| box(.) in plots.

    o	New standard package `modreg' (smoothing and local MODern
	REGression methods) contributed by B.D. Ripley.

    o	par() has a `no.readonly = FALSE' argument which allows more
	sensible  op <- par(no.readonly = TRUE);  on.exit(par(op)).

    o	Real Bessel functions of 1st to 3rd kind, of arbitrary order:
	besselI(), besselK(), besselJ(), besselY() are the I(), K(),
	J(), and Y() Bessel functions.

    o	New conflicts() function from B.D. Ripley

    o	uniroot has a new `maxiter' argument and returns #{iter} and
	precision.

    o	New option `show.coef.Pvalue' (default: TRUE).	If FALSE,
	print.summary.[g]lm does not print P values.

    o	New `R --vanilla' is equivalent to
	  R --no-save --no-restore --no-site-file --no-init-file

    o	gc() has now a `verbose' argument and returns a matrix with free
	and total n- and v-cells(heap).

    o	New example(<foo>) function runs the \emph{Examples} R code of
	<foo>.	example() calls source() which now has a `verbose'
	instead of `debug' argument.

    o	experimental functions [as.|is.|]pairlist() for the few old-style
	dotted pair lists [undocumented].

    o	options(check.bounds = TRUE) makes sub-assignments which
	"stretch" a vector give a warning [dropped undocumented
	check.bounds() function].

    o	Makefiles should now conform (mostly) with the GNU Coding
	Standards.  In particular, `make install', `make uninstall'
	and `make install-strip' now work.
	Also, it is now possible to build R in a non-source directory.

    o	which() preserves names and has a new `arr.ind' argument
	allowing for array indices.

    o	New functions {d,p,q,r}signrank for the Wilcoxon signed rank
	distribution, and {d,p,q,r}wilcox for the Wilcoxon (rank sum)
	distribution.

    o	Command line options GNUified a bit further.
	New command line option `--verbose' for printing more
	information about progress.
	Command line options `--vsize' and `--hsize' as replacements
	for `-v' and `-n' which are now deprecated.
	Added `--silent' as synonym for `--quiet'.
	Short-style option `-V' obsolete.

    o	Added bug.report() to generate & send bug reports from
	within R.

    o	The PostScript device driver now uses the ISO Latin1 font
	encoding.  This should allow Western Europeans to render
	their languages correctly.  It is likely that additional
	encodings will be added (e.g. Latin2) when we figure out
	how to set the correct font encoding in printers.

    o	The mathematical annotation code has been reworked.  Italic
	correction works better.  Additional functionality will be
	added.

    o	"sample" now has an optional "prob" argument which gives the
	probabilities of sampling each element in the vector being
	sampled.  The present implementation is based on some code
	from E. S. Venkatraman <venkat@biosta.mskcc.org>.

    o	The internal data structure used to represent lists has
	changed from being based on dotted pairs to generic vectors.
	Users should see no changes as a result (with the exception
	of some efficiency gains in list operations).

    o	Subscripting matches that of S more closely.  It is now
	possible to use subscripting beyond that the end of vectors
	and lists.

    o	Element labelling in "c" and "unlist" should match that of
	of S.

    o	Added split.screen etc functions for manipulating multiple
	screens on a single device

    o	After help.start() the HTML help system is used for all help()
	requests. The name of the browser is now controlled by
	options("browser").

    o	Added kmeans to package mva (donated by B. Ripley)

    o	New persp function added.  It is NOT compatible with S (yet)
	and is subject to internal and interface changes.

    o	gctorture() for torturing the garbage collector to reveal
	memory protection bugs. (Call GC on every memory allocation).

    o	B. Ripley's aov code (and more) has been added. This includes:

	- aov() now handles models with Error terms, multiple
	  responses.

	- proj(), model.tables(), se.contrast(), replications(),
	  eff.aovlist() are implemented for aov fits, and where
	  appropriate for lm fits.

	- dummy.coef(), with methods for lm and aovlist fits.

	- add1(), drop1(), step() for stepwise fitting of statistical
	  models, with default, lm and glm methods.

	- summary() and deviance() -- mlm methods.

	- kappa()  (for estimating condition numbers)

	- labels() to find a suitable set of labels from an object

	- C() for setting the contrasts of a factor

	- anova(), plot(), summary() and deviance() methods for mlm fits

    o	eval() semantics changed when envir= is a list. A 3rd argument is
	now allowed, specifying the enclosure (i.e. where R looks for
	variables *not* found in envir=) it defaults to the calling
	environment (was .GlobalEnv). Note that when used inside a function,
	it is often desirable to set the enclosure to the parent
	environment instead. [ eval(e, data, sys.frame(sys.parent())) ]


BUG FIXES

    o	min(NULL); max(double())  now give warnings.  range() gives NA.

    o	substring("", NULL) no longer segfaults.

    o	formatC(.) now takes default "width = 1" when both width and digits
	are unspecified.

    o	several fixes in internal axis and tickmarks setup for
	"extreme" ranges and values, especially for "log" scaling.

    o	seq(a,a, by=b) now works properly.

    o	print.data.frame(.) now calls print.matrix instead of print(.)
	which finally enables the 'right = TRUE' argument.

    o	R --help  gives more

    o	postscript() now uses 'hyphen' instead of 'plusminus' for a minus.

    o	source(..., echo=TRUE) now puts a `"' if necessary after truncation.

    o	Changes to the PostScript device driver mean that the volume
	of output has been reduced to about a third of what it was.

    o	Fixes and restructuring to name generation in connection with
	unlist() and c().

    o	Many bugs found and fixed in the memory allocation / garbage
	collection area. In particular, the parser was sometimes
	UNPROTECT()ing the wrong pointers.

    o	lm(y[g=="1"]~x[g=="1"]) caused memory corruption


		CHANGES IN R VERSION 0.62.4
BUG FIXES

    o	plot.default(.) has now 'sub' argument which eliminates
	"Warning: parameter "sub" couldn't be set in high-level plot() function"

    o	formatC(numeric(0)) now works.

    o	menu(.) works for empty imput

    o	0i ^ 2	now gives  0+0i as it should.

    o	ppoints() now behaves like S, and has additional argument 'a'

    o	seq(1,6,by=3) and similar "by" calls now work okay

    o	mahalanobis(.) now fixed; does *NOT* have default arguments for
	center and cov anymore.

    o	diag(.) doesn't return non-sensical dimnames anymore.


		CHANGES IN R VERSION 0.62.3

NEW FEATURES

    o	preserve factor levels and contrast settings in model objects

    o	factor[...,drop=T] reduces level set

    o	added dblepr, intpr

    o	do_modelmatrix(model.c): Set rownames from data argument.

    o	New generic function preplot().

    o	A new R BATCH interface for non-interactive execution.

    o	Added `offline' argument to help() for producing hardcopy via
	latex and dvips.

    o	glm.fit.null now calculates AIC and print.glm.null prints it

    o	effects.lm implemented

    o	new class "mlm" for multivariate "lm", predict.mlm to go with it

    o	"Details" section added to .Rd format

    o	R_PRINTCMD and R_PAPERSIZE can now be set via users' environment,
	overriding setting in startup script.

    o	enhanced identify()

    o	new function print.coefmat()

    o	added unix() as .Deprecated("system")

    o	date() replacing system.date()


BUG FIXES

    o	substitute would re-substitute after expanding ...

    o	indexing modified object in some cases

    o	sweep should work again on dataframes

    o	minor changes in aov()

    o	builds should now actually work on systems that do not add
	underscores to Fortran symbols

    o	biplot[.default]() was redundant in "base" package; now only in "mva".

    o	unix(..) now helps the user to find  system(..) instead.

    o	apropos("[") and methods("[") now both work (even though "[" is not
	a valid regular expression).

    o	row.names<-.default now exists. Converts object to data
	frame and then adds row names

    o	codes() now distinguishes between ordered and unordered factors

    o	codes() had *opposite* semantics of Splus. Now it's the same.

    o	replicating factors now yields factors (again)

    o	print.summary.xxx  functions more consistent, using new function
	print.coefmat().

    o	Changed many `T' to `TRUE'  and	 `F' to `FALSE' in the base package.

    o	binary operation on 1x1 matrix lost dimension

    o	fix anova.glm for null model

    o	glm.fit.null: ensure df.residual == df.null for a null model

    o	summary.glm: correlations in saturated cases

    o	stat.anova: use match.arg and labeled switch statement

    o	Major cleanup of glm iteration code

    o	Correct reordering of glm coefficients if pivoting

    o	Rownames on contrast matrices

    o	factor() and [.factor preserves class "ordered"

    o	Code rearrangement in predict.lm (avoid unnecessary computation)
	+ let rownames through on predictions

    o	model.matrix.default: Initial code to define model frame
	simplified considerably after defaulting data argument to
	sys.frame(sys.parent()).  This also removes the problem where
	data.frame mangles I(x^2) and similar names, so that the
	"reorder" sanity check at the end fails.

    o	The handling of extra FORTRAN libraries (f2c-related and BLAS)
	should now be correct.	Via SHLIBLDFLAGS, add-ons will also be
	linked against these libraries.

    o	Modified makefiles so configure followed by "make distclean"
	should restore the source tree to its original form.

    o	a leftover "colours <- colors" caused trouble when collating
	sequence changes caused files to go into the "base" file in a
	different order

		CHANGES IN R VERSION 0.62.2

(The new functions predict.glm, poly, aov, alias, biplot.default and
biplot.princop, update.default and rug all come from Brian D. Ripley,
who is also responsible for finding and/or fixing a lot of the bugs)

NEW FEATURES

    o	predict.glm() added.

    o	text() is generic.

    o	update.default() (replaces update.glm() and update.lm()).
	(This will only work if you comment out update.lm and
	update.glm in the sources, or disable them with
	update.lm<-function(object,...)NextMethod(), etc.)

    o	predict.lm() changed towards S-plus compatibility. Intervals are
	still available via interval= argument.

    o	zapsmall() function.

    o	polygon() now handles NAs

    o	options(show.signif.stars = TRUE).  If FALSE,
	summary.lm and similar functions do *not* print significance stars
	anymore.

    o	poly() for [g]lm modelling.

    o	aov()	for Analysis Of Variance [anova].

    o	alias() for displaying ``aliased'' factor levels in (>=2)way anova.

    o	mva: Now has  biplot and biplot.princomp

    o	rug() plot.

    o	new  src/library/profile/Common.R   for	 OS-independent intialization.

    o	new date stamp mechanism (ensures that prerelease versions carry
	correct date)

BUG FIXES

    o	abbreviate() now always retains the first letter.

    o	attr() partial matches for attribute name.

    o	axis() accepts graphical parameters.

    o	binomial() accepts factor responses.

    o	cbind() works with data frames.

    o	contrasts() gives simpler labels (like S) for factors with
	two levels.

    o	contrasts<-() now has a how.many= argument.

    o	contour() and image() can accept a list to specify the matrix.

    o	contr.poly() uses orthogonal polynomials (like S) not raw
	polynomials.

    o	data() could fail with a partial match to the dataset name.

    o	density() works correctly if from= or to= are used.
	    n= can now take any value, not just a large power of 2.

    o	expand.grid() now accepts more than two arguments,
	or a list of factors.

    o	factor() and ordered() handle their levels argument better.

    o	family.glm() now returns the correct family (including link etc).

    o	legend() now knows about lwd.

    o	match.args() works correctly for default arguments.

    o	model.frame.lm() did not invoke `lm'.

    o	model.matrix() calls model.frame() if needed.

    o	model.response() now returns names, so glm() gives names to
	residuals, fitted values, etc.

    o	quasi() works in glm() (was missing aic component).

    o	seq() sometimes omitted the final value due to rounding error.

    o	terms.formula() and update.formula() now resolve `.' in formulae
	and tidy up `(a + b) - b' etc.

    o	... is now passed down correctly to functions inside functions.

    o	save.image didn't work (Martyn Plummer)

    o	abs() instead of fabs() in seq.c crashed R on Digital Unix

    o	model.matrix() gagged on variables with complicated names

    o	saturated models acting up in glm

    o	various improvement of build procedures

    o	rbind(NULL, matrix) core dump

    o	density() default 'bw' now 0.9*(...) instead of 1.06*(...)
				[=Silverman's rule of thumb].

    o	detach(2) now works.

    o	format() doesn't drop names anymore.

    o	format.pval() works with NAs.

    o	print.[summary.][g]lm() functions print numbers better formatted.

    o	legend() now also works properly in  log coordinates.

    o	backsolve() now working;  bakslv.c not depending on
	Fortran_underscores.

    o	Tick marks acting up on log axes in postscript (fix from Martyn
	Plummer)

    o	The Rd format has a new section \details{} (needed for proper
	Sd2Rd translation). \R was not understood for nroff
	conversions, longer dashes (-- and --- in latex syntax) are
	now converted properly.

    o	prompt.default() now carries "\details{}".

    o	R [ SHLIB | COMPILE ] were broken on some Solaris systems
	due to use of bash syntax. R [ INSTALL | COMPILE | SHLIB ]
	now use a MAKE environment variable if present.
	R INSTALL only rebuilds man pages if they are not already
	up to date.


		CHANGES IN R VERSION 0.62.1

BUG FIXES

    o	Accidentally shipped R-0.62 without the tests and  etc/Rdoc
	directories.


		CHANGES IN R VERSION 0.62

NEW FEATURES

    o	Many more help(.) pages.

    o	The top level Makefile now supports the usual
	   ./configure; make; make install
	procedure (new make targets `all' and `install').

    o	The HTML help pages can now be searched for keywords.

    o	Conversion of functions to and from lists. formals<- and body<-.
	The alist() function makes it easier to construct argument lists,
	etc. Added expression-->list coercion.

    o	complex(.) now has optional 'argument' and 'modulus' arguments,
	allowing ``polar coordinate'' specifications.

    o	layout() documented and improved: starts default device if needed, and
	returns number of figures.

    o	New find() function [relying on apropos(..)].

    o	objects(<integer>) now works, being equivalent to
	objects(pos=<int.>).

    o	storage.mode() and related functions now return
	"double" instead of "real", for compatibility.
	"real" is still allowed as synomym for "double".

    o	A `tests' directory has been added (in the source), and "make
	tests" has been modified to run more than all the examples from
	the base package.  The exact `make tests' behavior is still
	bound to change.

    o	An experimental directory `etc/Rdoc' has been added with a perl5
	module to parse R documentation files.	Sample perl programs
	to use this module are also included.

    o	All internal mechanisms to support factors and data.frames have
	been removed.  These are now entirely supported by interpreted
	code!  `is.unordered' has been eliminated.  Thanks to John
	Chambers for allowing the distribution of his StatLib code.

    o	"pmatch" is now completely S compatible and is not just another
	name for "charmatch".

    o	There is now a function called ".Alias" which can be used to
	provide multiple names for the same object.  Example:
		lm2 <- .Alias(lm)
	This is dangerous because it can be used to defeat the
	call-by-value illusion.

    o	Many functions changed from <primitive> to .Internal(..).
	Currently, new .Internal(.)s in ..library/base/R/New-Internal.R
	Primitive functions are now printed as ``.Primitive(..)''.

    o	[dpqr]hyper(.) now also work with some 0 arguments.

    o	C-code: Many "-Wall" fixes (MM & DB).

    o	mva's dist() now takes arguments diag and upper which control
	how the distance matrix is printed. plot.hclust() now takes a
	labels argument.

    o	Attributes are now propagated correctly in binary operations.
	Changes from:
	  Steve Oncley and Gordon Maclean
	  National Center for Atmospheric Research
	  Boulder, Colorado USA

    o	configure now also checks for fort77.

    o	Usage of R INSTALL now is
	  R INSTALL [options] [-l lib] pkg_1 ... pkg_n
	The +/- options were replaced by GNU-style `--no-docs' and
	`--no-text', `--no-html', and `--no-latex'.

    o	Usage of R REMOVE now is
	  R REMOVE [options] [-l lib] pkg_1 ... pkg_n

    o	Usage of R COMPILE now is R COMPILE [options] srcfiles, where
	through options one can set e.g. CFLAGS or FFLAGS.

    o	Usage of R SHLIB now is R SHLIB [-o libname] files, where the
	file names can be that of source or object files.

    o	A new R CMD interface allows invokation of executables in
	$RHOME/{etc,cmd} without installing them or setting paths.

    o	Data files are now also documented using the Rd format, all
	data documentation in the base package has been converted
	accordingly. Rd files for data have a \keyword{datasets} as
	identifier.

    o	new function mahalanobis() for Mahalanobis distance

    o	quantile.default() now handles Inf's correctly.

    o	New command line options `--enable-blas' and `--enable-readline'
	to configure.

    o	pretty(x) is more reasonable when max(x)-min(x) < 1e-10 max(|x|),
	and has a new argument "shrink.sml" for that case.

    o	formatC(.) supports a new "fg" format for flexible
	non-exponential formatting.

    o	etc/build-htmlpkglist has been integrated into etc/build-help
	(option --htmllists)

    o	family	gaussian(.) and inverse.gaussian(.) both accept several
	link arguments [J.Lindsey].

    o	The graphics function "tck" now produces effects just
	like those in S (e.g. par(tck=1) now produces grid lines).
	Since using "tck" produces nasty results in some circumstances
	there is also an alternative parameter "tcl" which defines
	the tick length in terms of lines of text.  The default
	setting is par(tcl=-0.5).

    o	menu() now takes additional arguments `graphics' (currently
	unused) and `title'.

    o	New function plot.formula().
	plot.factor() now produces boxplots when given 2 arguments.

    o	New function write.table().

    o	signif() now has a `digits' default of 6.

    o	Old-style long command line options (`-save' etc) changed to
	GNU-style (`--save' etc).
	Debugging options (`-ddd', `-gdb', `-xxgdb') unified into the
	new `--debugger' (`-d').
	New command line options `--version' (`-V') and `--help' (`-h')
	which print useful information and exit.

    o	The loading of profiles at startup now works as follows.
	Unless the new `--no-site-file' was given, a site profile is
	sought (as specified via the environment variable `RPROFILE',
	or if this is unset defaulting to `${RHOME}/etc/Rprofile'.
	Then, unless the new `--no-init-file' was given, the user
	profiles (`.Rprofile' and `~/.Rprofile') are sought.

    o	New functions subset() and transform() intended primarily to
	make life with dataframes easier.

    o	debian directory has been added so Debian GNU/Linux packages can be
	created from raw source.

    o	The graphics system has been through a major overhaul.
	It is now possible to have multiple active device drivers
	and to control them with full suite of dev.xxx() functions
	available in S.	 Display lists are now kept for interactive
	devices.  When an on-screen graphics window is resized,
	the content of that window is redrawn at the new size.
	At present only X11 and PostScript graphics device drivers
	are available, but more are on the way.

    o	On systems using IEEE arithmetic, the builtin Inf and NaN
	values are now recognised and used.  NA and NaN should
	propagate correctly in computations, with NA dominating
	in computations involving both quantities.
	E.g. NA+NaN is NA.

    o	Some of the t, F, and chisq distribution/probability functions
	now allow a noncentrality parameter `ncp'.

    o	Functions ptukey() and qtukey() provide the distribution and
	quantile functions for the maximum of several studentized
	ranges.

    o	system.file()  [now documented] returns all files matched by
	wildcards.

    o	data() now supports more file formats: .RData for binary
	files, .txt or .tab for data to be read by
	`read.table(file, header=TRUE)' and .csv for data to be read
	by `read.table(file, header=TRUE, sep=";")'

    o	Rdconv: new tabular environment, new sections `\format' and
	`\source', new output format `-type Sd' for S documentation

    o	.First.lib() now implemented; called by library() after loading
	a package.

    o	print.summary.[g]lm() now give `significance stars' and a symbolic
	correlation matrix.

    o	new is.R() function.

    o	glm() now also returns an AIC value [from JL].
	print..glm methods indicate the options()$contrasts in some cases.
	In summary.glm(..., correlation=..), the default has been changed to
	corr. = FALSE  which is consistent with	 summary.lm().
	predict() now works again for glm objects.

    o	the `flag' argument in formatC(.) can now have more than one
	character.

    o	nlm() returns the number of iterations used [from J.Lindsey].

    o	cut, diff, hist, mean, quantile, seq, trunc()  are now all generic.
	cut() has an `include.lowest' argument as S.

    o	save.image() as short-cut to save the current session in .RData.

    o	new design of HTML help pages, including an index of all
	functions from all installed packages.

    o	new editor function pico()

    o	matrices and arrays can have zero extents

BUG FIXES (many of which resulted from the added features...)

    o	atanh(.) now works

    o	summary(glm) and summary(lm) now use compatible names.

    o	[pq]tukey(.) now working.

    o	title() now handles main=, sub=, xlab=, ylab= with embedded
	newlines correctly.  This is partly a change in title and
	partly a change in the underlying graphics code.

    o	min(.), max(.), sum(.)	now return integer for integer arguments.

    o	which(.) now returns integer.

    o	Rd files: leading whitespace of lines in user-defined sections
	was not correctly removed by Rdconv

    o	sign(.) works again.

    o	[.data.frame segfaulted if arg. wasn't a data frame

    o	"R --no-readline" now again gives proper prompts.

    o	demos/zero.R  dyn.load(.) now should be working more easily.

    o	mode(.) now returns "(" for a "parentheses 'call'".

    o	Bug fix in mva dist.c for method binary (gave "invalid
	distance"). plot.hclust failed for data without row names.

    o	R INSTALL should work (again) now when `pkg' is a relative file
	name.

    o	.not.yet.implemented() now takes an arbitrary number of args.

    o	Plotting of dendrograms is working again.

    o	data.frame(.) now uses "1:n" as default row.names.

    o	image(.) and contour(.) now also work called as, e.g., ``image(z)''.

    o	the first argument of axis(.) is now called `side' as in S.

    o	format(NULL) now works.

    o	minor fix in symnum.

    o	hist() now is more compatible to S, has a new `labels' argument,
	and should work ok for non-equidistant breaks.

    o	plot(-1) now labels properly.

    o	Many small code changes (eliminating extraneous variables, nested
	comm.) in C code in order to satisfy `gcc -Wall' [Doug Bates].

    o	model.extract() will now extract arbitrary model frame arguments.


    o	list of currently loaded libraries (.Dyn.libs) not saved
	from session to session (really, this time)

    o	rhyper works with vectorisation, degenerate cases.

    o	printing of objects in lists now dispatches methods correctly

		CHANGES IN R VERSION 0.61.2

BUG FIXES

    o	pretty(999) resulted in an infinite loop due to integer overflow.
	pretty(.) now sometimes returns different results than before.

    o	pi:6  returned integer, instead of real.

    o	[.data.frame caused segfault if called with non-dataframe argument

    o	hist() now is more compatible to S, has a new `labels' argument,
	and should work ok for non-equidistant breaks.

    o	lgamma(-1e7) segfaulted.
	gamma(.) and lgamma(.) now give proper results for negative integers.

    o	formatC(pi,dig=20,wid=2) segfaulted.

    o	quantile(..., pr = c(1,2,5)/1000)  gave all names as "0%".

    o	In 0.61.1, model.matrix was fixed to pay attention to the names of
	the names of its data arg, but the data arg was defaulting to an
	unnamed list, so  model.matrix(~x)  failed...

    o	Indexing with [[]] and a zero-length vector segfaulted.

    o	Coercion of factors as in S-plus

    o	dyn.load statement in demos/dynload/zero.R fixed

    o	Factors could get allocated without the OBJECT bit, which
	nearly drove Kurt mad trying to write plot.factor...

    o	Fixed confidence limit problem in t.test

		CHANGES IN R VERSION 0.61.1

NEW FEATURES

    o	None (by definition, x.y.z releases are bugfix releases now)

BUG FIXES

    o	Return statements of the form return(x,y) will now return
	a list with named components.

    o	Parsing of nested "if" statments was broken.  This is fixed now.
	(Reported by Paul Gilbert).

    o	Wrong declaration of ConsoleBufCnt in src/main/scan.c caused crash
	in Irix (George White <gwhite@bodnext.bio.dfo.ca>)

    o	if(nmatch = 0) bug in src/main/character.c fixed (Doug Bates)

    o	R_alloc/S_alloc fixes. The former allocated 4 times more than
	needed, the latter zeroed half of what it got, sizeof() mistakes
	in both cases.

    o	c(ordered factor) caused segfault (uninitalised pointer), now
	fixed.

    o	behaviour of as.numeric() on factors changed recently; now
	documented.

    o	model.matrix() now pays attention to the names on its dataframe
	argument.

    o	Fixes to group methods.

    o	autoload() caused infinite loop if function  wasn't found in
	library on loading

    o	The pager ate the rest of stdin in batch mode, now fixed. Also,
	stdout was not flushed before call to system(). "make tests"
	should work now.

    o	Empty directories now created by configure (so that it doesn't
	matter that "CVS export" doesn't do it)

    o	as.name() made idempotent (i.e. if is.name(x) then as.name(x)==x)

    o	3 problems with glm, 2 in glm.fit and a one in print.glm fixed
	[Jim Lindsey]

    o	binomial (family) now works when 'n=0'. [J.Lindsey]

    o	split() now also works in split(1:10,1:2)

    o	strsplit() now also works for strsplit(c,NULL)

    o	A LANG='..' environment variable no longer affects  scan()ing of
	numbers.

    o	seq(.) doesn't segfault anymore in  gl(2,3):gl(1,6)

    o	contour(.) now also works with integer arguments


		CHANGES IN R VERSION 0.61

We try to make development more flexible by creating a "CVS branch". This
should make it easier to produce patches for obvious bugs in the releases,
without having to wait for changes in other areas to stabilize.

NEW FEATURES

    o	New functions "all.vars" and "all.names" added.

    o	There has been a small change in the include file structure.
	All include files now live in RHOME/src/include and are
	copied to RHOME/include when needed.

    o	The "noquote" functions are now documented.

    o	A new `language' demo, "is.things", is provided.

    o	symnum(.) function

    o	The files in R/library/base/data have had a .R suffix added.

BUG_FIXES

    o	A nasty bug which showed when attempt was made to create
	a zero length call has been fixed.

    o	model.matrix(.) now allows a  contrasts argument.

    o	barplot(.) now also works for barplot(table(rpois(100,3))).

    o	make clean ; make    now should work;  ./Makefile.in eliminated

    o	format(.) is now generic;  the default method has a `digits' argument.


		CHANGES IN R VERSION 0.60.1

NEW FEATURES

    o	"split" is now a generic function, with a method for data frames.
	(contributed by Doug Bates).

    o	S compatible functions "all.names" and "all.vars" added.



BUG FIXES

    o	A file was closed multiple times if an error message occurred
	after sourcing a file.	In some versions of Linux this caused
	a core dump.

    o	The inclusion <readline/history.h> was causing problems with
	some versions of readline because the file did not exist.
	This is now detected by configure.



		CHANGES IN R VERSION 0.60

R is about to become an official part of the GNU project.
To quote RMS (Richard Stallman)

		``I hereby dub R GNU software!''


NEW FEATURES

    o	There has been a major change in directory structure
	masterminded by Kurt Hornik.
	library(.) now attaches ``package''s which are better
	integrated, see "?library".  Packages may be available from outside
	the RHOME path via the .lib.loc variable.

    o	The documentation format (of files in src/library/<package>/man/ )
	has changed to a more easily parsable LaTeX like format.
	The doc files now all end in `.Rd'.
	etc/Rman2Rd  can be used to translate old-style documentation to
	the new one.
	The translation to *roff, LaTeX and HTML is now done using
	etc/Rdconv, written in Perl by Fritz Leisch.

	The HTML online help produced has now links which work.
	The manual (in doc/manual/) now includes a section on the
	documentation format and on mathematical text in graphs.

	etc/ further contains `Sd2Rd' for (partial) translation of S `.d'
	documentation to Rd, and
	`Rd2txt' and `Rd2dvi' for easy previewing of single Rd files.

    o	The use of "names" on one dimensional arrays will now produce
	sensible results.  This means that for most purposes,
	one dimensional arrays can be treated like vectors.

    o	We have a applied a patch from mward@wolf.hip.berkeley.edu
	which should substantially improve the speed of (vector)
	arithmetic.

    o	The modeling formula handler has been expanded so that it
	accepts y ~ 0 + x as a "through the origin" specification.
	models with no parameters are now acceptable.

    o	"cov", "cor" and "var" now produce a matrix result if either
	of their x or y arguments is a matrix.	Dimnames are propagated
	in a sensible fashion.

    o	New chisq.test(.) and prop.test() from Kurt Hornik.

    o	New read.fwf(.) for reading fixed width format (KH).

    o	New str(.) [alternative to summary(.) for programmers] (MM).

    o	New example data sets "esoph", "infert" and "anscombe" (TL),
	"iris3" (KH) and "stackloss" (MM).

    o	source(.) has several new arguments, notably ``echo = FALSE''.
	This is applied in the new function  demo(.) which runs all the
	code in demos/ (but dynload).

    o	strheight(.) is new, accompanying strwidth(.).
	Both now work for mathematical expressions (Paul Murrell).

    o	The LaTeX version of the manual (-> doc/manual/) now has an index.

    o	EVERY *.Rd file in src/library/base/man/ has now at least one \keyword

    o	New package (`library(.)') "stepfun" for step functions, incl.
	empirical distributions.


BUG FIXES

    o	Regular expression matching is now done with system versions
	of the regexp library.	This should fix compilation problems
	on some platforms.

    o	"approx" and "approxfun", have had some minor adjustments.
	which fix the interpretation of the rule= argument.  The
	code for piecewise constant case is now internal C code
	that than interpreted.	This should boost performance in
	this case.

    o	There has been a minor fixup of "model.frame" to ensure that
	subsets, weights, etc are handled properly.

    o	Model fitting of the form

		 lm(y~., data=df)
		glm(y~., data=df)

	will now work.	The RHS of the model will consist of an
	additive model containing all (non-response) variables in the
	given data frame.

    o	The following type of assignment to data frame subsets

		z <- data.frame(x=rnorm(10),y=rnorm(10),z=rnorm(10))
		z[,1:2] <- matrix(1:20,nc=2)

	was producing incorrect results.  The solution was to wrap
	an implicit "as.data.frame" around the RHS.

    o	"[.data.frame" no longer has a default drop=TRUE argument.
	This means that subsetting a data frame with "[" will always
	yield a data frame.

    o	There was a swap of coordinates internally in "mtext" which
	meant that labels were coming out in the wrong place.  Fixed.

    o	Syntax errors in parse(text="...") would cause R to terminate
	with a segmentation violation.	This no longer happens, although
	the result is still not perfect (the parse() returns).
	This will be fixed by a future parse rewrite.

    o	rainbow, topo.colors, etc., now also work with n in {1,2};
	don't return duplicate neighbor colors anymore.

    o	legend has new `text.width' argument and now also works with
	mathematical expressions as text.

    o	hist() now works better, has a `plot = TRUE' argument, and returns
	something useful.

    o	barplot() improved for `names', now returns vector of midpoints.

    o	lm(), lm.fit, lm.wfit (was `lm.w.fit'):	 Made more compatible.
	Dealing with (close to) collinear situations is still not flexible
	enough.

    o	internal postscript() improved (missing lines in boxplot(.)).

    o	Improvement to many (even most ?) documentation (.Rd) files.

    o	Numerous other fixes of minor things ...



		  CHANGES IN R VERSION 0.50

WARNING!!!

 o  A change in the way that "expressions" are implemented means that
    saved data images which contain expressions will probably not
    restore properly.

NEW FEATURES

 o  The installation of documentation has now been streamlined.
    Many manual entries have been revised.

 o  "expressions" are now implemented as a basic type rather than as
    a class of object.	This change was made as move toward compatibility
    with S and also to implement mathematical annotation in graphs.
    For some examples of the latter, see ?text and ?title.

 o  "eigen" can now handle complex and non-symmetric matrices.

 o  Libraries are now attached by loading their code into newly created
    environment frames on the search path rather than in with the general
    system code.  This means that libraries can be unloaded as well as
    loaded.  They can also have .First.lib and .Last.lib functions.
    The variable .Libraries has been replaced by .library() but should not
    be needed much anymore.

 o  There is now an experimental function called "delay" which creates
    a promise to evaluate an expression.  This provides direct access
    to the lazy evaluation mechanism used by R.

 o  >>>>  'make tests'	 allows to test--run all the help() examples.

 o  New functions   matplot / matpoints / matlines.

 o  cut has 2 new arguments. 'right = TRUE' gives intervals closed on the
	right, open to the left (as S); 'right = FALSE' allows to reverse
	this. The code for default label construction has been enhanced,
	and can be controlled by the new argument 'dig.lab'.

 o  legend(.) has 2 new arguments 'cex' (obvious) and 'merge = FALSE'.
	-> ?legend.
 o  deparse  has a 2nd argument allowing for a kind of line width.
 o  There is now print.density (method).

 o  many help(.) pages have been updated with working examples,
	and several new ones have been created.

 o  influence.measures() and lm.influence now allow to get at the usual
    regression diagnostics.

BUG FIXES

 o  The "is.object" function has been with drawn.

 o  A bug which prevented the "pictex" graphics driver from working
    has been fixed.

 o  Regression diagnostics obtained with "lm.influence" now work when
    there are weights.	This means they should work for glms.

 o  There was a problem in parsing files from statements which were
    separated from following statements by ";" (e.g. data(iris); iris).
    This is fixed.

 o  Comments are handled better in functions.  The rule is that they
    are shifted to just before their statements.  Comments after the
    last statement of a function are lost.

 o  It is now possible to perform complicated mutations of expressions.
    For example
	e <- quote(f(x=1,y=2))
	names(e)[[2]] <- "a"
    will change the x= argument tag into a=.  In the past this produced
    odd error messages.

 o  The length function now tries to return a "sensible" value for all
    the built-in types.	 For example, symbols now have length 1.

 o  "update" should now work in both "lm" and "glm" models.

 o  The functions Re, Im, Mod, Arg and Conj will now accept real-valued
    arguments and return the obvious results.

 o  Minor graphics cleanup.

 o  A fix for convergence problems in glm from Thomas Lumley included.

 o  A new version of qt() should not take infinitely long to get an
    answer in the large degrees if freedom case.  The underlying code
    (Hill 1970, CACM) appears to be much faster and more accurate than
    Splus.

 o  A final Newton step has been added to give a final "polish" to
    the quantiles produced by pnorm().	These should be close to full
    accuracy now.

 o  A bug in qbeta found by Martin Maechler has been fixed.  This should
    speed up quantile computation for the F and Beta distributions.
    Further improvements in qbeta(.) by MM.  No infinite loops anymore.

 o  rainbow(.) now allows "start > end" indexing the "color circle".
    topo.colors(n), terrain.colors(n), heat.colors(n) now also work for n=1,2.

 o  ?"+" now works.

 o  tapply has been fixed as indicated by T. Lumley.
