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

	This file covers NEWS for the 1.x series
	See 'NEWS.2' for subsequent changes.

	**************************************************
	*						 *
	*	       1.9 SERIES NEWS			 *
	*						 *
	**************************************************


		CHANGES IN R VERSION 1.9.1 Patched


INSTALLATION ISSUES

    o	Installation will now work even in Norwegian and Danish locales
	which sort AA at the end (for package stats4 which has AAA.R).


BUG FIXES

    o	Various memory leaks have been plugged and uses of strcpy()
	with overlapping src and dest corrected.

    o	R CMD INSTALL now also works for /bin/sh's such as the one from
	Solaris 8 which fail when a function has the same name as a variable.

    o	The Date method for trunc() failed.

    o	window() failed if both start and end were outside the time
	range of the original series (possible if extend = TRUE).

    o	coplot(..) doesn't give an extraneous warning anymore when called
	on a fresh device.

    o	hasArg() used wrong logic to get the parent function. (sys.function()
	behaves differently from what is documented.)

    o	prompt(f) now gives proper \usage{..} for
	f <- function(x, g = function(u) { v <- u^2 ; sin(v)/v }) { g(x) }

    o	package.skeleton() now uses the supplied name in the DESCRIPTION
	file.

    o	options(list('digits', 'scipen')) no longer seg.faults, the
	problem being the misuse of a list (PR#7078).

    o	summary.Date() now has a more sensible default for 'digits'.

    o	list.files(all.files = TRUE, recursive = TRUE) died on infinite
	recursion. (PR#7100)

    o	cor(as.array(c(a=1,b=2)), cbind(1:2)) no longer seg.faults (PR#7116).
	cor(), cov() and var() no longer accidentally work with list()
	arguments as if they were unlist()ed.

    o	as.matrix(data.frame(d=as.POSIXct("2004-07-20"))) doesn't give a
	wrong warning anymore.

    o	gsub(perl=TRUE) code got the R length of return strings wrong
	in some circumstances (when the string was shortened).
	(Fixed also PR#7108)

    o	summaryRprof() was ignoring functions whose name begins with dot,
	e.g. .C, .Call, .Fortran. (PR#7137)

    o	loglin() could segfault if 'start' was of the wrong length.  (PR#7123)

    o	model.tables(type="means") could fail in a design where a
	projection gave all zeros. (PR#7132)

    o	Applying attributes() to a pairlist, e.g. .Options, could segfault.

    o	The checking of R versions incorrectly assumed 1.9.1 >= 1.50.

    o	str(Surv(..)) failed for  type = "counting"  Surv objects and for
	promises.

    o	approx(c(1,2),c(NA,NA),1.5,rule=2) does not segfault anymore
	(PR#7177), but gives an error.

    o	nls(model = TRUE) was broken.

    o	Subsetted assignments of the form A[i1, i2, i3] <- B stopped as
	soon as an NA was encountered in an index so subsequent non-NA
	indices were ignored.  (PR#7210)

    o	Fixed bug in handling of lwd=NA in contour().
    
    o	is.na() was returning undefined results on nested lists.




		CHANGES IN R VERSION 1.9.1


NEW FEATURES

    o	as.Date() now has a method for "POSIXlt" objects.

    o	mean() has a method for "difftime" objects and so summary()
	works for such objects.

    o	legend() has a new argument 'pt.cex'.

    o	plot.ts() has more arguments, particularly 'yax.flip'.

    o	heatmap() has a new 'keep.dendro' argument.

    o	The default barplot method now handles vectors and 1-d arrays
	(e.g., obtained by table()) the same, and uses grey instead of
	heat color palettes in these cases.  (Also fixes PR#6776.)

    o	nls() now looks for variables and functions in its formula in
	the environment of the formula before the search path, in the
	same way lm() etc look for variables in their formulae.


INSTALLATION ISSUES

    o	src/modules/X11/dataentry.c would not build on some XFree
	4.4.0 systems.	(This is a bug in their header files but we have
	added a workaround.)

    o	Building with gcc/g77 3.4.0 on ix86 platforms failed to produce
	a working build: the critical LAPACK routines are now compiled
	with -ffloat-store.

    o	Added patches to enable 64-bit builds on AIX 5.1: see the R-admin
	manual for details.

    o	Added some patches to allow non-IEEE-754 installations to work
	reasonably well.  (Infs and NAs are still not handled properly
	in complex arithmetic and functions such as sin().  See also
	Deprecated, as support for non-IEEE-754 installations is about
	to be removed.)

    o	Installation will now work in Estonian (et_EE*) locales, which
	sort z before u.  (PR#6958)


DEPRECATED & DEFUNCT

    o	Support for non-IEEE-754 arithmetic (which has been untested
	for some time) will be removed in the next full release.

    o	Direct use of R INSTALL|REMOVE|BATCH|COMPILE|SHLIB is
	deprecated: use R CMD instead.

    o	The gnome/GNOME graphics device is deprecated and will be
	removed in the next full release.


BUG FIXES

    o	pbinom(q, N, prob) is now more accurate when prob is close to 0.
	(PR#6757)

    o	pcauchy(x, .., log.p) is now more accurate for large x,
	particularly when log.p = TRUE.	(PR#6756)

    o	pgeom(q, prob, lower.tail, log.p) is now (sometimes much) more
	accurate when prob is very small. (PR#6792)

	The code for pgeom(prob=1) assumed IEEE 754 arithmetic, and
	gave NaNs under gcc 3.4.0 -fPIC, for example.

    o	makeARIMA() was not handling an ARMA(0, 0) model correctly.

    o	as.Date() was failing on factors.  (PR#6779)

    o	min(), max() and range() were failing on "difftime" objects.

    o	as.data.frame.list() could fail on some unusual list names.
	(PR#6782)

    o	type.convert() ignored na.strings when no conversion was done.
	(PR#6781, not needed for its primary use in read.table.)

    o	Fixed a clipping problem in the quartz() device.

    o	Subsetting a factor swapped the order of the attributes, which
	identical() cares about.  (PR#6799)

    o	The L-BFGS-B option of optim() apparently needs part of its
	workspace zeroed.  (PR#6720)

    o	extractAIC.survreg() needed updating.

    o	When using the header Rmath.h in standalone mode, the case where
	TRUE, FALSE are already defined is now handled correctly.

    o	Package utils now exports several functions that are needed for
	writing Sweave drivers.

    o	Comparison of two lists/expressions was giving nonsensical
	(and often random) answers, and is now an error.

    o	The C-level function ncols was returning a random answer
	(often 0) for a 1D array.  This caused model.matrix to
	misbehave (perhaps segfault) if a term was a 1D array.	(PR#6838)

    o	The configure script now finds the pdf viewers ggv and gpdf.

    o	Workaround for the problems strptime on MacOS X has with dates
	before 1900.

    o	'R CMD build' works in a directory whose path contains spaces.
	(PR#6830 under Unix/Linux: it already worked under Windows.)
	Also 'R CMD check'.

    o	mosaicplot() stops cleanly if given a table containing missing values.

    o	install.packages() from a local CRAN was broken.

    o	bxp() fixed for e.g.,  boxplot(..., border=2:4)

    o	approx(list(x=rep(NaN,9), y=1:9), xout=NaN) does not seg.fault
	anymore (PR#6809).

    o	plot(1, pch=NA) does not give an error anymore and
	plot(1:2, pch=c("o",NA)) only prints one symbol	 (PR#6876).

    o	diffinv(matrix(3, 7,0)) now works.

    o	plot.ts(z) for multivariate 'z' now properly draws all 'nc' xlab`s
	when nc > 1 and obeys 'ann=FALSE' or 'axes=FALSE'.

    o	aggregate(.data.frame) failed if the answer would have had one
	row.

    o	recordPlot() and replayPlot() failed to duplicate the display
	list, so further plotting altered the saved or replayed object.

    o	Assignments of the form adf[i,j] <- value now accept a
	data-frame value as well as a list value.

    o	dir.create() sometimes erroneously continued to report a directory
	already existed after the first instance.  (PR#6892)

    o	arima.sim() allows a null model.

    o	which.min() & which.max()'s C code now PROTECT()'s its result.

    o	Building standalone nmath did not support some of the DEBUG options.

    o	mle() got confused if start value list was not in same order as
	arguments of likelihood function (reported by Ben Bolker)

    o	backsolve(r, x, k) now allows k < nrow(x) - as its documentation
	always claimed.

    o	update.packages("mgcv") and old.packages(*) now give a better error
	message; and installed.packages("mgcv") properly returns <empty>.

    o	stats:::as.dendrogram.hclust() is documented and no longer re-sorts
	the two children at each node.	This fixes as.dendrogram(hh) for
	the case where hh is a "reordered" hclust object.

	plot.dendrogram(x) now draws leaves 'x' more sensibly.

	reorder.dendrogram() now results in a dendrogram with correct
	"midpoint"s, and hence reordered dendrograms are plotted correctly.

	stats:::midcache.dendrogram() and hence the reorder() and rev()
	dendrogram methods do not return bloated dendrograms.

    o	heatmap(*, labRow=., labCol=.) now also reorders the labels when
	specified---not only when using default labels.

    o	Copying lattice (grid) output to another device now works again
	(There were intermittent problems in 1.9.0 - PR#6915, #6947/8.)

    o	hist() uses a more robust choice of its 'diddle' factor, used
	to detect if an observation is on a bin boundary.  (PR#6931)

    o	jitter(x) now returns x when length(x) == 0.

    o	Under some rare circumstances the locale-specific tables used by
	the perl=TRUE option to grep() etc were being corrupted and so
	matches were missed.

    o	qbinom(*, prob = 0, lower.tail = FALSE) now properly gives 0.
	(PR#6972)

    o	Class "octmode" needed a "[" method to preserve the class: see
	example(file.info) for an example.



		CHANGES IN R VERSION 1.9.0


USER-VISIBLE CHANGES

    o	Underscore '_' is now allowed in syntactically valid names, and
	make.names() no longer changes underscores.  Very old code
	that makes use of underscore for assignment may now give
	confusing error messages.

    o	Package 'base' has been split into packages 'base', 'graphics',
	'stats' and 'utils'.  All four are loaded in a default
	installation, but the separation allows a 'lean and mean'
	version of R to be used for tasks such as building indices.

	Packages ctest, eda, modreg, mva, nls, stepfun and ts have been
	merged into stats, and lqs has been returned to MASS.  In all
	cases a stub has been left that will issue a warning and ensure
	that the appropriate new home is loaded.  All the time series
	datasets have been moved to package stats.  Sweave has been
	moved to utils.

	Package mle has been moved to stats4 which will become the
	central place for statistical S4 classes and methods
	distributed with base R.  Package mle remains as a stub.

	Users may notice that code in .Rprofile is run with only the
	new base loaded and so functions may now not be found.	For
	example, ps.options(horizontal = TRUE) should be preceded by
	library(graphics) or called as graphics::ps.options or,
	better, set as a hook -- see ?setHook.

    o	There has been a concerted effort to speed up the startup of
	an R session: it now takes about 2/3rds of the time of 1.8.1.

    o	A warning is issued at startup in a UTF-8 locale, as currently R
	only supports single-byte encodings.


NEW FEATURES

    o	$, $<-, [[, [[<- can be applied to environments. Only character
	arguments are allowed and no partial matching is done.	The
	semantics are basically that of get/assign to the environment with
	inherits=FALSE.

    o	There are now print() and [ methods for "acf" objects.

    o	aov() will now handle singular Error() models, with a warning.

    o	arima() allows models with no free parameters to be fitted (to
	find log-likelihood and AIC values, thanks to Rob Hyndman).

    o	array() and matrix() now allow 0-length `data' arguments for
	compatibility with S.

    o	as.data.frame() now has a method for arrays.

    o	as.matrix.data.frame() now coerces an all-logical data frame
	to a logical matrix.

    o	New function assignInNamespace() parallelling fixInNamespace.

    o	There is a new function contourLines() to produce contour
	lines (but not draw anything).	This makes the CRAN package
	clines (with its clines() function) redundant.

    o	D(), deriv(), etc now also differentiate asin(), acos(), atan(),
	(thanks to a contribution of Kasper Kristensen).

    o	The `package' argument to data() is no longer allowed to be a
	(unquoted) name and so can be a variable name or a quoted
	character string.

    o	There is a new class "Date" to represent dates (without times)
	plus many utility functions similar to those for date-times.
	See ?Date.

    o	Deparsing (including using dump() and dput()) an integer
	vector now wraps it in as.integer() so it will be source()d
	correctly.  (Related to PR#4361.)

    o	.Deprecated() has a new argument `package' which is used in
	the warning message for non-base packages.

    o	The print() method for "difftime" objects now handles arrays.

    o	dir.create() is now an internal function (rather than a call to
	mkdir) on Unix as well as on Windows.  There is now an option
	to suppress warnings from mkdir, which may or may not have
	been wanted.

    o	dist() has a new method to calculate Minkowski distances.

    o	expand.grid() returns appropriate array dimensions and dimnames
	in the attribute "out.attrs", and this is used by the
	predict() method for loess to return a suitable array.

    o	factanal(), loess() and princomp() now explicitly check for
	numerical inputs; they might have silently coded factor
	variables in formulae.

    o	New functions factorial(x) defined as gamma(x+1) and for
	S-PLUS compatibility, lfactorial(x) defined as lgamma(x+1).

    o	findInterval(x, v) now allows +/-Inf values, and NAs in x.

    o	formula.default() now looks for a "terms" component before a
	'formula' argument in the saved call: the component will have
	`.' expanded and probably will have the original environment
	set as its environment.	 And what it does is now documented.

    o	glm() arguments `etastart' and `mustart' are now evaluated via
	the model frame in the same way as `subset' and `weights'.

    o	Functions grep(), regexpr(), sub() and gsub() now coerce their
	arguments to character, rather than give an error.

	The perl=TRUE argument now uses character tables prepared for
	the locale currently in use each time it is used, rather than
	those of the C locale.

    o	New functions head() and tail() in package `utils'.
	(Based on a contribution by Patrick Burns.)

    o	legend() has a new argument 'text.col'.

    o	methods(class=) now checks for a matching generic, and so no
	longer returns methods for non-visible generics (and
	eliminates various mismatches).

    o	A new function mget() will retrieve multiple values from an
	environment.

    o	model.frame() methods, for example those for "lm" and "glm",
	pass relevant parts of ... onto the default method.  (This has
	long been documented but not done.)  The default method is now
	able to cope with model classes such as "lqs" and "ppr".

    o	nls() and ppr() have a `model' argument to allow the model frame
	to be returned as part of the fitted object.

    o	"POSIXct" objects can now have a "tzone" attribute that
	determines how they will be converted and printed.  This means
	that date-time objects which have a timezone specified will
	generally be regarded as in their original time zone.

    o	postscript() device output has been modified to work around
	rounding errors in low-precision calculations in gs >= 8.11.
	(PR#5285, which is not a bug in R.)

	It is now documented how to use other Computer Modern fonts,
	for example italic rather than slanted.

    o	ppr() now fully supports categorical explanatory variables,

	ppr() is now interruptible at suitable places in the
	underlying FORTRAN code.

    o	princomp() now warns if both `x' and `covmat' are supplied,
	and returns scores only if the centring used is known.

    o	psigamma(x, deriv=0), a new function generalizes, digamma() etc.
	All these (psigamma, digamma, trigamma,...) now also work for  x < 0.

    o	pchisq(*, ncp > 0) and hence qchisq() now work with much higher
	values of ncp; it has become much more accurate in the left tail.

    o	read.table() now allows embedded newlines in quoted fields. (PR#4555)

    o	rep.default(0-length-vector, length.out=n) now gives a vector
	of length n and not length 0, for compatibility with S.

	If both `each' and `length.out' have been specified, it now
	recycles rather than fills with NAs for S compatibility.

	If both `times' and `length.out' have been specified, `times'
	is now ignored for S compatibility.  (Previously padding with
	NAs was used.)

	The "POSIXct" and "POSIXlt" methods for rep() now pass ... on
	to the default method (as expected by PR#5818).

    o	rgb2hsv() is new, an R interface the C API function with the same name.

    o	User hooks can be set for onLoad, library, detach and
	onUnload of packages/namespaces: see ?setHook.

    o	save() default arguments can now be set using option
	"save.defaults", which is also used by save.image() if option
	"save.image.defaults" is not present.

    o	New function shQuote() to quote strings to be passed to OS shells.

    o	sink() now has a split= argument to direct output to both the
	sink and the current output connection.

    o	split.screen() now works for multiple devices at once.

    o	On some OSes (including Windows and those using glibc)
	strptime() did not validate dates correctly, so we have added
	extra code to do so.  However, this cannot correct scanning
	errors in the OS's strptime (although we have been able to
	work around these on Windows).	Some examples are now tested for
	during configuration.

    o	strsplit() now has `fixed' and `perl' arguments and
	split="" is optimized.

    o	subset() now allows a `drop' argument which is passed on to
	the indexing method for data frames.

    o	termplot() has an option to smooth the partial residuals.

    o	varimax() and promax() add class "loadings" to their loadings
	component.


    o	Model fits now add a "dataClasses" attribute to the terms, which
	can be used to check that the variables supplied for
	prediction are of the same type as those used for fitting.
	(It is currently used by predict() methods for classes "lm",
	"mlm", "glm" and "ppr", as well as methods in packages MASS,
	rpart and tree.)

    o	New command-line argument --max-ppsize allows the size of the
	pointer protection stack to be set higher than the previous
	limit of 10000.

    o	The fonts on an X11() device (also jpeg() and png() on Unix)
	can be specified by a new argument `fonts' defaulting to the
	value of a new option "X11fonts".

    o	New functions in the tools package: pkgDepends, getDepList and
	installFoundDepends.  These provide functionality for assessing
	dependencies and the availability of them (either locally or
	from on-line repositories).

    o	The parsed contents of a NAMESPACE file are now stored at
	installation and if available used to speed loading the
	package, so packages with namespaces should be reinstalled.

    o	Argument `asp' although not a graphics parameter is accepted
	in the ... of graphics functions without a warning.  It now
	works as expected in contour().

    o	Package stats4 exports S4 generics for AIC() and BIC().

    o	The Mac OS X version now produces an R framework for easier linking
	of R into other programs.  As a result, R.app is now relocatable.

    o	Added experimental support for conditionals in NAMESPACE files.

    o	Added as.list.environment to coerce environments to lists
	(efficiently).

    o	New function addmargins() in the stats package to add marginal
	summaries to tables, e.g. row and column totals.  (Based on a
	contribution by Bendix Carstensen.)

    o	dendrogam edge and node labels can now be expressions (to be
	plotted via stats:::plotNode called from plot.dendrogram).
	The diamond frames around edge labels are more nicely scaled
	horizontally.

    o	Methods defined in the methods package can now include
	default expressions for arguments.  If these arguments are
	missing in the call, the defaults in the selected method will
	override a default in the generic.  See ?setMethod.

    o	Changes to package 'grid':

	- Renamed push/pop.viewport() to push/popViewport().

	- Added upViewport(), downViewport(), and seekViewport() to
	  allow creation and navigation of viewport tree
	  (rather than just viewport stack).

	- Added id and id.lengths arguments to grid.polygon() to allow
	  multiple polygons within single grid.polygon() call.

	- Added vpList(), vpStack(), vpTree(), and current.vpTree()
	  to allow creation of viewport "bundles" that may be pushed
	  at once (lists are pushed in parallel, stacks in series).

	  current.vpTree() returns the current viewport tree.

	- Added vpPath() to allow specification of viewport path
	  in downViewport() and seekViewport().

	  See ?viewports for an example of its use.

	  NOTE: it is also possible to specify a path directly,
	  e.g., something like "vp1::vp2", but this is only
	  advised for interactive use (in case I decide to change the
	  separator :: in later versions).

	- Added "just" argument to grid.layout() to allow justification
	  of layout relative to parent viewport *IF* the layout is not
	  the same size as the viewport.  There's an example in
	  help(grid.layout).

	- Allowed the "vp" slot in a grob to be a viewport name or a
	  vpPath.  The interpretation of these new alternatives is to
	  call downViewport() with the name or vpPath before drawing the
	  grob and upViewport() the appropriate amount after drawing the
	  grob.	 Here's an example of the possible usage:

	      pushViewport(viewport(w=.5, h=.5, name="A"))
	      grid.rect()
	      pushViewport(viewport(w=.5, h=.5, name="B"))
	      grid.rect(gp=gpar(col="grey"))
	      upViewport(2)
	      grid.rect(vp="A", gp=gpar(fill="red"))
	      grid.rect(vp=vpPath("A", "B"), gp=gpar(fill="blue"))

	- Added engine.display.list() function.	 This allows the user to
	  tell grid NOT to use the graphics engine display list and to handle
	  ALL redraws using its own display list (including redraws after
	  device resizes and copies).

	  This provides a way to avoid some of the problems with resizing
	  a device when you have used grid.convert(), or the gridBase package,
	  or even base functions such as legend().

	  There is a document discussing the use of display lists in grid
	  on the grid web site
	  (http://www.stat.auckland.ac.nz/~paul/grid/grid.html)

	- Changed the implementation of grob objects.  They are no longer
	  implemented as external references.  They are now regular R objects
	  which copy-by-value.	This means that they can be saved/loaded
	  like normal R objects.  In order to retain some existing grob
	  behaviour, the following changes were necessary:

	  + grobs all now have a "name" slot.  The grob name is used to
	    uniquely identify a "drawn" grob (i.e., a grob on the display
	    list).
	  + grid.edit() and grid.pack() now take a grob name as the first
	    argument instead of a grob.	 (Actually, they take a gPath -
	    see below)
	  + the "grobwidth" and "grobheight" units take either a grob
	    OR a grob name (actually a gPath - see below).  Only in the
	    latter case will the unit be updated if the grob "pointed to"
	    is modified.

	  In addition, the following features are now possible with grobs:

	  + grobs now save()/load() like any normal R object.
	  + many grid.*() functions now have a *Grob() counterpart.  The
	    grid.*() version is used for its side-effect of drawing
	    something or modifying something which has been drawn;  the
	    *Grob() version is used for its return value, which is a grob.
	    This makes it more convenient to just work with grob
	    objects without producing any graphical output
	    (by using the *Grob() functions).
	  + there is a gTree object (derived from grob), which is a grob
	    that can have children.  A gTree also has a "childrenvp" slot
	    which is a viewport which is pushed and then "up"ed before the
	    children are drawn;	 this allows the children of a gTree to
	    place themselves somewhere in the viewports specified in the
	    childrenvp by having a vpPath in their vp slot.
	  + there is a gPath object, which is essentially a concatenation
	    of grob names.  This is used to specify the child of
	    (a child of ...) a gTree.
	  + there is a new API for creating/accessing/modifying grob objects:
	    grid.add(), grid.remove(), grid.edit(), grid.get() (and their
	    *Grob() counterparts can be used to add, remove, edit, or extract
	    a grob or the child of a gTree.  NOTE: the new grid.edit() API
	    is incompatible with the previous version.

	- Added stringWidth(), stringHeight(), grobWidth(), and grobHeight()
	  convenience functions (they produce "strwidth", "strheight",
	  "grobwidth", and "grobheight" unit objects, respectively).

	- Allowed viewports to turn off clipping altogether.
	  Possible settings for viewport clip arg are now:

	    "on"      = clip to the viewport (was TRUE)
	    "inherit" = clip to whatever parent says (was FALSE)
	    "off"     = turn off clipping

	  Still accept logical values (and NA maps to "off")


UTILITIES

    o	R CMD check  now runs the (Rd) examples with default RNGkind
	(uniform & normal) and set.seed(1).
	example(*, setRNG = TRUE) does the same.

    o	undoc() in package `tools' has a new default of `use.values =
	NULL' which produces a warning whenever the default values of
	function arguments differ between documentation and code.
	Note that this affects "R CMD check" as well.

    o	Testing examples via massage-examples.pl (as used by R CMD
	check) now restores the search path after every help file.

    o	checkS3methods() in package 'tools' now also looks for generics
	in the loaded namespaces/packages listed in the Depends fields
	of the package's DESCRIPTION file when testing an installed
	package.

    o	The DESCRIPTION file of packages may contain a 'Suggests:'
	field for packages that are only used in examples or
	vignettes.

    o	Added an option to package.dependencies() to handle the
	'Suggests' levels of dependencies.

    o	Vignette dependencies can now be checked and obtained via
	vignetteDepends.

    o	Option 'repositories' to list URLs for package repositories
	added.

    o	package.description() has been replaced by packageDescription().

    o	R CMD INSTALL/build now skip Subversion's .svn directories as
	well as CVS directories.


C-LEVEL FACILITIES

    o	arraySubscript and vectorSubscript take a new argument which
	is a function pointer that provides access to character
	strings (such as the names vector) rather than assuming these
	are passed in.

    o	R_CheckUserInterrupt is now described in `Writing R Extensions'
	and there is a new equivalent subroutine rchkusr for calling
	from FORTRAN code.

    o	hsv2rgb and rgb2hsv are newly in the C API.

    o	Salloc and Srealloc are provided in S.h as wrappers for S_alloc
	and S_realloc, since current S versions use these forms.

    o	The type used for vector lengths is now R_len_t rather than
	int, to allow for a future change.

    o	The internal header nmath/dpq.h has slightly improved macros
	R_DT_val() and R_DT_Cval(), a new R_D_LExp() and improved
	R_DT_log() and R_DT_Clog();  this improves accuracy in several
	[dpq]-functions {for "extreme" arguments}.


DEPRECATED & DEFUNCT

    o	print.coefmat() is defunct, replaced by printCoefmat().

    o	codes() and codes<-() are defunct.

    o	anovalist.lm (replaced in 1.2.0) is now defunct.

    o	glm.fit.null(), lm.fit.null() and lm.wfit.null() are defunct.

    o	print.atomic() is defunct.

    o	The command-line arguments --nsize and --vsize are no longer
	recognized as synonyms for --min-nsize and --min-vsize (which
	replaced them in 1.2.0).

    o	Unnecessary methods coef.{g}lm and fitted.{g}lm have been
	removed: they were each identical to the default method.

    o	La.eigen() is deprecated now eigen() uses LAPACK by default.

    o	tetragamma() and pentagamma() are deprecated, since they are
	equivalent to psigamma(, deriv=2) and psigamma(, deriv=3).

    o	LTRUE/LFALSE in Rmath.h have been removed: they were
	deprecated in 1.2.0.

    o	package.contents() and package.description() have been deprecated.


INSTALLATION CHANGES

    o	The defaults for configure are now --without-zlib
	--without-bzlib --without-pcre.

	The included PCRE sources have been updated to version 4.5 and
	PCRE >= 4.0 is now required if --with-pcre is used.

	The included zlib sources have been updated to 1.2.1, and this
	is now required if --with-zlib is used.

    o	configure no longer lists bzip2 and PCRE as `additional
	capabilities' as all builds of R have had them since 1.7.0.

    o	--with-blas=goto to use K. Goto's optimized BLAS will now work.


BUG FIXES

    o	When lm.{w}fit() disregarded arguments in ... they reported
	the values and not the names.

    o	lm(singular.ok = FALSE) was looking for 0 rank, not rank < p.

    o	The substitution code for strptime in the sources no longer
	follows glibc in silently `correcting' invalid inputs.

    o	The cor() function did not remove missing values in the
	non-Pearson case.

    o	[l]choose() use a more accurate formula which also slightly
	improves p- and qhyper(); choose(n, k) now returns 0 instead
	of NaN for k < 0 or > n.

    o	find(simple.words=TRUE) (the default) was still using regular
	expressions for e.g. "+" and "*".  Also, it checked the mode
	only of the first object matching a regular expression found
	in a package.

    o	Memory leaks in [dpq]wilcox and [dqr]signrank have been plugged.
	These only occurred when multiple values of m or n > 50 were
	used in a single call. (PR#5314, plus another potential leak.)

    o	Non-finite input values to eigen(), La.eigen(), svd() and
	La.svd() are now errors: they often caused infinite
	looping.  (PR#5406, PR#4366, PR#3723: the fix for 3723/4366
	returned a vector of NAs, not a matrix, for the eigenvectors.)

    o	stepfun(x,y) now gives an error when `x' has length 0 instead
	of an invalid result (that could lead to a segmentation
	fault).

    o	buildVignettes() uses file.remove() instead of unlink() to
	remove temporary files.

    o	methods(class = "lqs") does not produce extraneous entries anymore.

    o	Directly calling a method that uses NextMethod() no longer
	produces the erroneous error message 'function is not a
	closure'.

    o	chisq.test(x, simulate.p.value = TRUE) could hang in an infinite
	loop or segfault, as r2dtable() did, when the entries in x where
	large. (PR#5701)

    o	fisher.test(x) could give a P-value of 'Inf' in similar cases which
	now result in an error (PR#4688).  It silently truncated
	non-integer 'x' instead of rounding.

    o	cutree(a, h=h) silently gave wrong results when 'a' was an
	agnes object; now gives an error and reminds of as.hclust().

    o	postscript() could crash if given a font value outside the
	valid range 1...5.

    o	qchisq(1-e, .., ncp=.) did not terminate for small e.
	(PR#6421 (PR#875))

    o	contrasts() turns a logical variable into a factor.  This now
	always has levels c("FALSE", "TRUE") even if only one (or
	none) of these occur in the variable.

    o	model.frame()'s lm and glm methods had 'data' and 'na.action'
	arguments which they ignored and have been removed.

    o	The defaults data=list() in lm() and glm() could never be
	used and have been removed.  glm had na.action=na.fail, again
	never used.

    o	The internal tools function for listing all internal S3 generics
	was omitting all the members of the S3 group generics, which
	also accept methods for members.

    o	Some BLASes were returning NA %*% 0 as 0 and some as NA.  Now
	slower but more careful code is used if NAs are present. (PR#4582)

    o	package.skeleton() no longer generates invalid filenames for
	code and help files.  Also, care is taken not to generate
	filenames that differ only by case.

    o	pairs() now respects axis graphical parameters such as
	cex.main, font.main and las.

    o	Saving images of packages with namespaces (such as mle) was
	not compressing the image.

    o	When formula.default() returned a terms object, it returned a
	result of class c("terms", "formula") with different
	subsetting rules from an object of class "formula".

    o	The standalone Rmath library did not build correctly on systems
	with inaccurate log1p.

    o	Specifying asp is now respected in calls like plot(1, 10, asp=1)
	with zero range on both axes.

    o	outer() called rep() with an argument the generic does not
	have, and discarded the class of the answer.

    o	object.size() now returns a real (not integer) answer and so
	can cope with objects occupying more than 2Gb.

    o	Lookups base:: and ::: were not confining their search to the
	named package/namespace.

    o	qbinom() was returning NaN for prob = 0 or 1 or size = 0 even
	though the result is well-defined.  (In part, PR#5900.)

    o	par(mgp)[2] was being interpreted as relative to par(mgp)[3].
	(PR#6045)

    o	Versioned install was broken both with and without namespaces:
	no R code was loaded.

    o	methods(), getS3method() and the registration of S3 methods in
	namespaces were broken if the S3 generic was converted into an
	S4 generic by setting an S4 method.

    o	Title and copyright holder of the reference manual are now in
	sync with the citation() command.

    o	The validation code for POSIXlt dates and hence
	seq(, by="DSTdays") now works for large mday values (not
	just those in -1000...1000).  (PR#6212)

    o	The print() method for data frames now copes with data frames
	containing arrays (other than matrices).

    o	texi2dvi() and buildVignettes() use clean=FALSE as default
	because the option is not supported on some Solaris
	machines. For buildVignettes() this makes no difference as it
	uses an internal cleanup mechanism.

    o	The biplot() method for "prcomp" was not registered nor exported.
	(PR#6425)

    o	Latex conversion of .Rd files was missing newline before
	\end{Section} etc which occasionally gave problems, as fixed for
	some other \end{Foo} in 1.8.1.	(PR#5645)

    o	Work around a glibc bug to make the %Z format usable in strftime().

    o	The glm method for rstandard() was wrongly scaled for cases where
	summary(model)$dispersion != 1.

    o	Calling princomp() with a covariance matrix (rather than a
	list) failed to predict scores rather than predict NA as
	intended.  (PR#6452)

    o	termplot() is more tolerant of variables not in the data= argument.
	(PR#6327)

    o	isoreg() could segfault on monotone input sequences.  (PR#6494)

    o	Rdconv detected \link{\url{}} only very slowly.	 (PR#6496)

    o	aov() with Error() term and no intercept incorrectly assigned
	terms to strata. (PR#6510)

    o	ftable() incorrectly handled arguments named "x".  (PR#6541)

    o	vector(), matrix(), array() and their internal equivalents
	report correctly that the number of elements specified was too
	large (rather than reporting it as negative).

    o	Minor copy-paste error in example(names).  (PR#6594)

    o	length<-() now works correctly on factors (and is now generic
	with a method for factors).

    o	x <- 2^32; x:(x+3) no longer generates an error (but gives a
	result of type "double").

    o	pgamma(30, 100, lower=FALSE, log=TRUE) is not quite 0, now.
	pgamma(x, alph) now only uses a normal approximation for
	alph > 1e5 instead of alph > 1000.  This also improves the accuracy
	of ppois().

    o	qgamma() now does one or more final Newton steps, increasing
	accuracy from around 2e-8 to 3e-16 in some cases.  (PR#2214).
	It allows values p close to 1 not returning Inf, with accuracy for
	'lower=FALSE', and values close to 0 not returning 0 for
	'log=TRUE'.  These also apply to qchisq(), e.g.,
	qchisq(1e-13, 4, lower=FALSE) is now finite and
	qchisq(1e-101, 1) is positive.

    o	gamma(-n) now gives NaN for all negative integers -n.

    o	The Unix version of browseURL() now protects the URL from the
	shell, for example allowing & and $ to occur in the URL.

	It was incorrectly attempting to use -remote "openURL()" for
	unknown browsers.

    o	extractAIC.coxph() works around an inconsistency in the
	$loglik output from coxph.  (PR#6646)

    o	stem() was running into integer overflows with nearly-constant
	inputs, and scaling badly for constant ones.  (Partly PR#6645)

    o	system() under Unix was losing the 8095th char if the output
	was split.  (PR#6624)

    o	plot.lm() gave incorrect results if there were zero weights.
	(PR#6640)

    o	Binary operators warned for inconsistent lengths on vector op
	vector operations, but not on vector op matrix ones.  (PR#6633
	and more.)

	Comparison operators did not warn about inconsistent lengths
	for real vectors, but did for integer, logical and character
	vectors.

    o	spec.pgram(x, ..., pad, fast, ...) computed the periodogram with
	a bias (downward) whenever 'pad > 0' (non-default) or 'fast = TRUE'
	(default) and nextn(n) > n where n = length(x); similarly for
	'df' (approximate degrees of freedom for chisq).

    o	dgamma(0, a) now gives Inf for a < 1 (instead of NaN), and
	so does dchisq(0, 2*a, ncp).

    o	pcauchy() is now correct in the extreme tails.

    o	file.copy() did not check that any existing `from' file had
	been truncated before appending the new contents.

    o	The QC files now check that their file operations succeeded.

    o	replicate() worked by making the supplied expression the
	body of an anonymous function(x), leading to a variable
	capture issue. Now, function(...) is used instead.

    o	chisq.test(simulate.p.value = TRUE) was returning slightly
	incorrect p values, notably p = 0 when the data gave the most
	extreme value.

    o	terms.formula(simplify = TRUE) was losing offset terms.
	Multiple offset terms were not being removed correctly if two
	of them appeared first or last in the formula.	(PR#6656)

    o	Rd conversion to latex did not add a new line before
	\end{Section} in more cases than were corrected in 1.8.1.

    o	split.default() dropped NA levels in its internal code but
	returned them as NA in all components in the interpreted code
	for factors.  (PR#6672)

    o	points.formula() had problems if there was a subset argument
	and no data argument.  (PR#6652)

    o	as.dist() does a bit more checking of its first argument and now
	warns when applied to non-square matrices.

    o	mle() gives a more understandable error message when its 'start'
	argument is not ok.

    o	All uses of dir.create() check the return value.
	download.packages() checks that destdir exists and is a directory.

    o	Methods dispatch corrects an error that failed to find
	methods for classes that extend sealed classes (class unions
	that contain basic classes, e.g.).

    o	Sweave no longer wraps the output of code chunks with
	echo=false and results=tex in Schunk environments.

    o	termplot() handles models with missing data better, especially
	with na.action=na.exclude.

    o	1:2 * 1e-100  now prints with correct number of spaces.

    o	Negative subscripts that were out of range or NA were not handled
	correctly.  Mixing negative and NA subscripts is now caught as
	an error: it was not caught on some platforms and segfaulted
	on others.

    o	gzfile() connections had trouble at EOF when used on uncompressed
	file.

    o	The Unix version of dataentry segfaulted if the `Copy' button
	was used.  (PR#6605)

    o	unlist on lists containing expressions now works (PR#5628)

    o	D(), deriv() and deriv3() now also can deal with gamma and lgamma.

    o	The X11 module can now be built against XFree86 4.4.0 headers (still
	with some warnings).

    o	seq.POSIXt(from, to, by="DSTdays") was shorter than expected
	for rare times in the UK time zone.  (PR#4558)

    o	c/rbind() did not support vectors/matrices of mode "list".  (PR#6702)

    o	summary() methods for POSIX[cl]t and Date classes coerced the
	number of NAs to a date on printing.

    o	KalmanSmooth would sometimes return NA values with NA inputs.
	(PR#6738)

    o	fligner.test() worked correctly only if data were already sorted
	by group levels. (PR#6739)



	**************************************************
	*						 *
	*	       1.8 SERIES NEWS			 *
	*						 *
	**************************************************


		CHANGES IN R VERSION 1.8.1


NEW FEATURES

    o	There is now a "Complex" S3 group generic (a side-effect of
	fixing up the corresponding S4 group generic).

    o	help("regex") now gives a description of the regular expressions
	used in R.

    o	The startup message now shows the R Foundation as copyright
	holder, and includes the R ISBN number and a pointer to the new
	citation() function.

    o	The solve() function now uses the `tol' argument for all
	non-complex cases.  The default tolerance for LINPACK is 1e-7,
	as before.  For LAPACK it currently is .Machine$double.eps but
	may be changed in later versions of R.

    o	help.search() now defaults to agrep = FALSE when keyword= is
	specified, since no one wants fuzzy matching of categories.

    o	Function texi2dvi() in package tools can be used to compile
	latex files from within R, provided the OS has a command
	texi2dvi or texify.

    o	Objects with formal S4 classes saved in pre-1.8 versions and
	loaded into the current version have incompatible class
	attributes (no package information).  A new function,
	fixPre1.8() in package methods, will fix the class attributes.
	See the help for this function.

    o	heatmap() allows Rowv/Colv = NA, suppressing the corresponding
	dendrogram.

    o	An "antifeature": Tcl 8.0 is now officially unsupported. In 1.8.0
	it just didn't work. This very old version lacks several features
	that are needed for the new version of the tcltk package. R will
	still build the tcltk package against Tcl 8.0 but the resulting
	package will not load.


BUG FIXES

    o	symnum(x) now behaves as documented when length(x) == 0 and uses
	lower.triangular = FALSE for logical arrays.

    o	c() now has a method for "noquote" objects and hence works as
	expected.

    o	split(1:10, c(1,2)) no longer gives a spurious warning.

    o	The "Complex" S4 group generic now works.

    o	abbreviate() doesn't get into infinite loops on input that differs
	only by leading/trailing space

    o	Added check for user interrupt in Rvprintf to allow printing to be
	interrupted.

    o	Fixed bug that would cause segfault on protect stack overflow.

    o	crossprod() on matrices with zero extents would return an
	uninitialized matrix (rather than one filled with zeros).

    o	DF[[i,j]] for a data frame used row j and col i, not as intended
	row i and col j.

    o	Even more user errors in recursive indexing of lists are now
	caught.	 (PR#4486)

    o	cor(<matrix>, use = "pairwise") gave wrong result in 1.8.0 (only).
	(PR#4646)

    o	merge.data.frame() could give incorrect names when one of the
	arguments had only one column.	(PR#4299)

    o	Subsetting a one-dimensional array dropped dimensions even when
	they were not of length one.  (Related to PR#4110)

    o	The plot() method for `ecdf' objects, plot.ecdf(), now allows to
	set a `ylab' argument (different from the default).

    o	cor.test(*, method="spearman") gave wrong results `randomly'
	(because of a wrong type passed to C; PR#4718).

    o	dist() objects with NA's didn't print these, now do. (PR#4866).

    o	regexpr(fixed = TRUE) returned 0-based indices.

    o	df[, length_1_index] <- value did not recycle short rhs. (PR#4820)

    o	median() no longer `works' for odd-length factor variables.

    o	packageStatus() is more robust to failing to contact a
	repository, and contacts the correct paths in the repositories
	under Windows.

    o	.setOldIs (methods) contained a typo stopping POSIXct objects (etc)
	being included in formal classes.

    o	terms() sometimes removed offset() terms incorrectly, since it
	counted by variables and not terms.  Its "offset" attribute
	was incorrectly documented as referring to terms not
	variables. (Related to PR#4941)

    o	buildVignettes() and pkgVignettes() in package tools are now
	documented.  The call to texi2dvi is wrapped in the new
	function texi2dvi() which also works on Windows.

    o	hclust() was sometimes not finding the correct inter-cluster
	distances with non-monotone methods.  (PR#4195)

    o	plot.hclust() now tolerates mode changes on dumped objects. (PR#4361)

    o	prompt() no longer insists files are in the current directory.
	(PR#4978)

    o	filter() did not use init in reverse order as documented. (PR#5017)

    o	contrasts<-() and model.matrix() now have sanity checks that
	factors having at least 2 levels (or one level and a contrast
	matrix): model.matrix() gave nonsensical results for 0-level
	factors.

    o	writeChar() could segfault if more characters were requested
	than exist. (PR#5090)

    o	round() and signif() dropped attributes with 0-length inputs,
	only. (PR#4710)

    o	The default graphics device in the GNOME interface was gtk,
	which is no longer in the base package. It is now X11.

    o	The print button on the toolbar of the GNOME graphics device
	did not work.

    o	The example code on the man page for TkWidgetcmds had not been
	updated after the change that made tkget (et al.) return
	tclObj objects, so the "Submit" button didn't work.

    o	Rd conversion to latex did not add a new line before
	\end{Section} for the section environments, which caused
	problems if the last thing in a section was \preformatted{}
	(and potentially elsewhere).

    o	Under some circumstances mosaicplot() failed if main was
	supplied as it was passed on to model.frame.default().

    o	Conversion to POSIXlt (including printing) of POSIXct dates
	before 1902 and after 2038 computed which were leap years from
	(year-1900) so got some xx00 years wrong.


		CHANGES IN R VERSION 1.8.0


MACOS CHANGES

    o	As from this release there is only one R port for the
	Macintosh, which runs only on Mac OS X.	(The `Carbon' port has
	been discontinued, and the `Darwin' port is part of the new
	version.)   The current version can be run either as a
	command-line application or as an `Aqua' console.  There is a
	`Quartz' device quartz(), and the download and installation of
	both source and binary packages is supported from the Aqua
	console.  Those CRAN and BioC packages which build under Mac OS X
	have binary versions updated daily.


USER-VISIBLE CHANGES

    o	The defaults for glm.control(epsilon=1e-8, maxit=25) have been
	tightened: this will produce more accurate results, slightly
	slower.

    o	sub, gsub, grep, regexpr, chartr, tolower, toupper, substr,
	substring, abbreviate and strsplit now handle missing values
	differently from "NA".

    o	Saving data containing name space references no longer warns
	about name spaces possibly being unavailable on load.

    o	On Unix-like systems interrupt signals now set a flag that is
	checked periodically rather than calling longjmp from the
	signal handler.	 This is analogous to the behavior on Windows.
	This reduces responsiveness to interrupts but prevents bugs
	caused by interrupting computations in a way that leaves the
	system in an inconsistent state.  It also reduces the number
	of system calls, which can speed up computations on some
	platforms and make R more usable with systems like Mosix.


CHANGES TO THE LANGUAGE

    o	Error and warning handling has been modified to incorporate a
	flexible condition handling mechanism.	See the online
	documentation of 'tryCatch' and 'signalCondition'.  Code that
	does not use these new facilities should remain unaffected.

    o	A triple colon operator can be used to access values of internal
	variables in a name space (i.e. a:::b is the value of the internal
	variable b in name space a).

    o	Non-syntactic variable names can now be specified by inclusion
	between backticks `Like This`.	The deparse() code has been
	changed to output non-syntactical names with this convention,
	when they occur as operands in expressions.  This is controlled
	by a `backtick' argument, which is by default TRUE for
	composite expressions and FALSE for single symbols.  This
	should give minimal interference with existing code.

    o	Variables in formulae can be quoted by backticks, and such
	formulae can be used in the common model-fitting functions.
	terms.formula() will quote (by backticks) non-syntactic names
	in its "term.labels" attribute.	 [Note that other code using
	terms objects may expect syntactic names and/or not accept
	quoted names: such code will still work if the new feature is
	not used.]


NEW FEATURES

    o	New function bquote() does partial substitution like LISP backquote.

    o	capture.output() takes arbitrary connections for `file' argument.

    o	contr.poly() has a new `scores' argument to use as the base set
	for the polynomials.

    o	cor() has a new argument `method = c("pearson","spearman","kendall")'
	as cor.test() did forever. The two rank based measures do work with
	all three missing value strategies.

    o	New utility function cov2cor() {Cov -> Corr matrix}.

    o	cut.POSIXt() now allows `breaks' to be more general intervals
	as allowed for the `by' argument to seq.POSIXt().

    o	data() now has an 'envir' argument.

    o	det() uses an LU decomposition and LAPACK.  The `method'
	argument to det() no longer has any effect.

    o	dev.control() now accepts "enable" as well as "inhibit".
	(Wishlist PR#3424)

    o	*, - and / work more generally on "difftime" objects, which now
	have a diff() method.

    o	dt(*, ncp = V)	is now implemented, thanks to Claus Ekstrom.

    o	dump() only quotes object names in the file where necessary.

    o	eval() of a promise forces the promise

    o	file.path() now returns an empty character vector if given at
	least one zero-length argument.

    o	format() and hence print() make an effort to handle corrupt
	data frames, with a warning.

    o	format.info() now also works with `nsmall' in analogy with
	format.default().

    o	gamma(n) is very slightly more precise for integer n in 11:50.

    o	? and help() will accept more un-quoted arguments, e.g. NULL.

    o	The "?" operator has new forms for querying documentation on
	S4 methods.  See the online documentation.

    o	New argument frame.plot = axes (== TRUE)  for filled.contour().

    o	New argument fixed = TRUE for grep() and regexpr() to avoid the
	need to escape strings to match.

    o	grep(x, ..., value = TRUE) preserves names of x.

    o	hist.POSIXt() can now pass arguments to hist.default()

    o	legend() and symbols() now make use of xy.coords() and accept
	a wider range of coordinate specifications.

    o	Added function library.dynam.unload() to call dyn.unload() on
	a loaded DLL and tidy up.  This is called for all the standard
	packages in namespaces with DLLs if their namespaces are unloaded.

    o	lm(singular.ok = FALSE) is now implemented.

    o	Empty lm() and glm() fits are now handled by the normal
	code: there are no methods for classes "lm.null" and
	"glm.null".  Zero-rank fits are handled consistently.

    o	make.names() has improvements, and there is a new auxiliary
	function make.unique().	 (Based on code contributed by Tom
	Minka, since converted to a .Internal function.)  In
	particular make.names() now recognises that names beginning
	with a dot are valid and that reserved words are not.

    o	methods() has a print method which asterisks functions which
	are not user-visible.  methods(class = "foo") now lists
	non-visible functions, and checks that there is a matching generic.

    o	model.matrix() now warns when it removes the response from the
	rhs of the formula: that this happens is now documented on its
	help page.

    o	New option `locatorBell' to control the confirmation beep
	during the use of locator() and identify().

    o	New option("scipen") provides some user control over the
	printing of numbers in fixed-point or exponential notation.
	(Contributed by David Brahm.)

    o	plot.formula() now accepts horizontal=TRUE and works correctly
	when boxplots are produced.  (Wishlist PR#1207)	 The code has
	been much simplified and corrected.

    o	polygon() and rect() now interpret density < 0 or NA to mean
	filling (by colour) is desired: this allows filling and
	shading to be mixed in one call, e.g. from legend().

    o	The predict() methods for classes lm, glm, mlm and lqs take a
	`na.action' argument that controls how missing values in
	`newdata' are handled (and defaults to predicting NA).
	[Previously the value of getOption("na.action") was used and
	this by default omitted cases with missing values, even if set
	to `na.exclude'.]

    o	print.summary.glm() now reports omitted coefficients in the
	same way as print.summary.lm(), and both show them as NAs in
	the table of coefficients.

    o	print.table() has a new argument `zero.print' and is now
	documented.

    o	rank(x, na.last = "keep") now preserves NAs in `x', and the
	argument `ties.method' allows to use non-averaging ranks in the
	presence of ties.

    o	read.table()'s 'as.is' argument can be character, naming columns
	not to be converted.

    o	rep() is now a generic function, with default, POSIXct and
	POSIXlt methods.  For efficiency, the base code uses rep.int()
	rather than rep() where possible.

    o	New function replicate() for repeated evaluation of expression
	and collection of results, wrapping a common use of sapply()
	for simulation purposes.

    o	rev() is now a generic function, with default and dendrogram
	methods.

    o	serialize() and unserialize() functions are available for
	low-level serialization to connections.

    o	socketSelect() allows waiting on multiple sockets.

    o	sort(method = "quick", decreasing = TRUE) is now implemented.

    o	sort.list() has methods "quick" (a wrapper for sort(method =
	"quick", index.return = TRUE) and "radix" (a very fast method
	for small integers).  The default "shell" method works faster
	on long vectors with many ties.

    o	stripchart() now has `log', `add' and `at' arguments.

    o	strsplit(x, *) now preserves names() but won't work for
	non-character `x' anymore {formerly used as.character(x),
	destroying names(x)}.

    o	textConnection() now has a local argument for use with output
	connections.  local = TRUE means the variable containing the
	output is assigned in the frame of the caller.

    o	Using UseMethod() with more than two arguments now gives a
	warning (as R-lang.texi has long claimed it did).

    o	New function vignette() for viewing or listing vignettes.

    o	which.min(x) and which.max(x) now preserve names.

    o	xy.coords() coerces "POSIXt" objects to "POSIXct", allowing
	lines etc to added to plot.POSIXlt() plots.

    o	.Machine has a new entry, sizeof.pointer.

    o	.Random.seed is only looked for and stored in the user's
	workspace.  Previously the first place a variable of that name
	was found on the search path was used.

    o	Subscripting for data.frames has been rationalized:

	- Using a single argument now ignores any `drop' argument
	  (with a warning).  Previously using `drop' inhibited list-like
	  subscripting.

	- adf$name <- value now checks for the correct length of
	  `value', replicating a whole number of times if needed.

	- adf[j] <- value and adf[[j]] <- value did not convert
	  character vectors to factors, but adf[,j] <- value did.
	  Now none do.	Nor is a list `value' coerced to a data frame
	  (thereby coercing character elements to factors).

	- Where replicating the replacement value a whole number of
	  times will produce the right number of values, this is
	  always done (rather than some times but not others).

	- Replacement list values can include NULL elements.

	- Subsetting a data frame can no longer produce duplicate
	  column names.

	- Subsetting with drop=TRUE no longer sometimes drops
	  dimensions on matrix or data frame columns of the data frame.

	- Attributes are no longer stripped when replacing part of a column.

	- Columns added in replacement operations will always be
	  named, using the names of a list value if appropriate.

	- as.data.frame.list() did not cope with list names such as
	  `check.rows',	 and formatting/printing data frames with such
	  column names now works.

	- Row names in extraction are still made unique, but without
	  forcing them to be syntactic names.

	- adf[x] <- list() failed if x was of length zero.


    o	Setting dimnames to a factor now coerces to character, as S
	does.  (Earlier versions of R used the internal codes.)

    o	When coercion of a list fails, a meaningful error message is given.

    o	Adding to NULL with [[ ]] generates a list if more than one
	element is added (as S does).

    o	There is a new command-line flag --args that causes the rest of
	the command line to be skipped (but recorded in commandArgs()
	for further processing).

    o	S4 generic functions and method dispatch have been modified to
	make the generic functions more self-contained (e.g., usable
	in apply-type operations) and potentially to speed dispatch.

    o	The data editor is no longer limited to 65535 rows, and will
	be substantially faster for large numbers of columns.

    o	Standalone Rmath now has a get_seed function as requested (PR#3160).

    o	GC timing is not enabled until the first call to gc.time(); it
	can be disabled by calling gc.time(FALSE).  This can speed up
	the garbage collector and reduce system calls on some
	platforms.


STANDARD PACKAGES

    o	New package 'mle'. This is a simple package to find maximum
	likelihood estimates, and perform likelihood profiling and
	approximate confidence limits based upon it.  A well-behaved
	likelihood function is assumed, and it is the responsibility
	of the user to gauge the applicability of the asymptotic
	theory.	 This package is based on S4 methods and classes.

    o	Changes in package 'mva':

	- factanal() now returns the test statistic and P-value formerly
	  computed in the print method.

	- heatmap() has many more arguments, partly thanks to Wolfgang
	  Huber and Andy Liaw.

	- Arguments `unit' and `hmin' of plclust() are now implemented.

	- prcomp() now accepts complex matrices, and there is biplot()
	  method for its output (in the real case).

	- dendrograms are slightly better documented, methods working with
	  "label", not "text" attribute.  New rev() method for dendrograms.

	- plot.dendrogram() has an explicit `frame.plot' argument
	  defaulting to FALSE (instead of an implicit one defaulting to TRUE).

    o	Changes in package 'tcltk':

	- The package is now in a namespace.  To remove it you will
	  now need to use unloadNamespace("tcltk").

	- The interface to Tcl has been made much more efficient by
	  evaluating Tcl commands via a vector of Tcl objects rather
	  than by constructing the string representation.

	- An interface to Tcl arrays has been introduced.

	- as.tclObj() has gained a `drop' argument to resolve an
	  ambiguity for vectors of length one.

    o	Changes in package 'tools':

	- Utilities for testing and listing files, manipulating file
	  paths, and delimited pattern matching are now exported.

	- Functions checkAssignFuns(), checkDocArgs() and checkMethods()
	  have been renamed to checkReplaceFuns(), checkDocFiles(), and
	  checkS3methods, to given better descriptions of what they do.

	- R itself is now used for analyzing the markup in the \usage
	  sections.  Hence in particular, replacement functions or S3
	  replacement methods are no longer ignored.

	- checkDocFiles() now also determines 'over-documented' arguments
	  which are given in the \arguments section but not in \usage.

	- checkDocStyle() and checkS3Methods() now know about internal S3
	  generics and S3 group generics.

	- S4 classes and methods are included in the QC tests.
	  Warnings will be issued from undoc() for classes  and
	  methods defined but not documented.  Default methods
	  automatically generated from nongeneric functions do not
	  need to be documented.

	- New (experimental) functions codocClasses() and codocData()
	  for code/documentation consistency checking for S4 classes and
	  data sets.

    o	Changes in package 'ts':

	- arima.sim() now checks for inconsistent order specification
	  (as requested in PR#3495: it was previously documented not to).

	- decompose() has a new argument `filter'.

	- HoltWinters() has new arguments `optim.start' and
	  `optim.control', and returns more components in the fitted
	  values.  The plot method allows `ylim' to be set.

	- plot.ts() has a new argument `nc' controlling the number of
	  columns (with default the old behaviour for plot.mts).

	- StructTS() now allows the first value of the series to be
	  missing (although it is better to omit leading NAs). (PR#3990)


USING PACKAGES

    o	library() has a pos argument, controlling where the package is
	attached (defaulting to pos=2 as before).

    o	require() now maintains a list of required packages in the
	toplevel environment (typically, .GlobalEnv).  Two features
	use this:  detach() now warns if a package is detached that is
	required by an attached package, and packages that install
	with saved images no longer need to use require() in the
	.First as well as in the main source.

    o	Packages with name spaces can now be installed using --save.

    o	Packages that use S4 classes and methods should now work with
	or without saved images (saved images are still recommended
	for efficiency), writing setMethod(), etc. calls with the
	default for argument `where'.  The topenv() function and
	sys.source() have been changed correspondingly.	 See the
	online help.

    o	Users can specify in the DESCRIPTION file the collation order
	for files in the R source directory of a package.


DOCUMENTATION CHANGES

    o	Changes in R documentation format:

	- New logical markup commands for emphasizing (\strong) and
	  quoting (\sQuote and \dQuote) text, for indicating the usage
	  of an S4 method (\S4method), and for indicating specific kinds
	  of text (\acronym, \cite, \command, \dfn, \env, \kbd, \option,
	  \pkg, \samp, \var).

	- New markup \preformatted for pre-formatted blocks of text
	  (like \example but within another section).  (Based on a
	  contribution by Greg Warnes.)

	- New markup \concept for concept index entries for use by
	  help.search().

    o	Rdconv now produces more informative output from the special
	\method{GENERIC}{CLASS} markup for indicating the usage of S3
	methods, providing the CLASS info in a comment.

    o	\dontrun sections are now marked within comments in the
	user-readable versions of the converted help pages.

    o	\dontshow is now the preferred name for \testonly.


INSTALLATION CHANGES

    o	The zlib code in the sources is used unless the external
	version found is at least version 1.1.4 (up from 1.1.3).

    o	The regression checks now have to be passed exactly, except
	those depending on recommended packages (which cannot be
	assumed to be present).

    o	The target make check-all now runs R CMD check on all the
	recommended packages (and not just runs their examples).

    o	There are new macros DYLIB_* for building dynamic libraries,
	and these are used for the dynamic Rmath library (which was
	previously built as a shared object).

    o	If a system function log1p is found, it is tested for accuracy
	and if inadequate the substitute function in src/nmath is
	used, with name remapped to Rlog1p.  (Apparently needed on
	OpenBSD/NetBSD.)


C-LEVEL FACILITIES

    o	There is a new installed header file R_ext/Parse.h which
	allows R_ParseVector to be called by those writing extensions.
	(Note that the interface is changed from that used in the
	unexported header Parse.h in earlier versions, and is not
	guaranteed to remain unchanged.)

    o	The header R_ext/Mathlib.h has been removed.  It was replaced by
	Rmath.h in R 1.2.0.

    o	PREXPR has been replaced by two macros, PREXPR for obtaining the
	expression and PRCODE for obtaining the code for use in eval.
	The macro BODY_EXPR has been added for use with closures.
	For a closure with a byte compiled body, the macro BODY_EXPR
	returns the expression that was compiled; if the body is not
	compiled then the body is returned.  This is to support byte
	compilation.

    o	Internal support for executing byte compiled code has been added.
	A compiler for producing byte compiled code will be made available
	separately and should become part of a future R release.

    o	On Unix-like systems calls to the popen() and system() C library
	functions now go through R_popen and R_system.	On Mac OS X these
	suspend SIGALRM interrupts around the library call.  (Related to
	PR#1140.)


UTILITIES

    o	R CMD check accepts "ORPHANED" as package maintainer. Package
	maintainers can now officially orphan a package, i.e., resign
	from maintaining a package.

    o	R CMD INSTALL (Unix only) is now 'safe': if the attempt to
	install a package fails, leftovers are removed.	 If the package
	was already installed, the old version is restored.

    o	R CMD build excludes possible (obsolete) data and vignette
	indices in DCF format (and hence also no longer rebuilds them).

    o	R CMD check now tests whether file names are valid across file
	systems and supported operating system platforms.  There is some
	support for code/documentation consistency checking for data
	sets and S4 classes.  Replacement functions and S3 methods in
	\usage sections are no longer ignored.

    o	R CMD Rdindex has been removed.


DEPRECATED & DEFUNCT

    o	The assignment operator `_' has been removed.

    o	printNoClass() is defunct.

    o	The classic Mac OS port is no longer supported, and its files
	have been removed from the sources.

    o	The deprecated argument 'white' of parse() has been removed.

    o	Methods pacf/plot.mts() have been removed and their functionality
	incorporated into pacf.default/plot.ts().

    o	print.coefmat() is deprecated in favour of printCoefmat()
	(which is identical apart from the default for na.print which
	is changed from "" to "NA", and better handling of the 0-rank
	case where all coefficients are missing).

    o	codes() and codes<-() are deprecated, as almost all uses
	misunderstood what they actually do.

    o	The use of multi-argument return() calls is deprecated: use a
	(named) list instead.

    o	anovalist.lm (replaced in 1.2.0) is now deprecated.

    o	- and Ops methods for POSIX[cl]t objects are removed: the
	POSIXt methods have been used since 1.3.0.

    o	glm.fit.null(), lm.fit.null() and lm.wfit.null() are deprecated.

    o	Classes "lm.null" and "glm.null" are deprecated and all of their
	methods have been removed.

    o	Method weights.lm(), a copy of weights.default(), has been removed.

    o	print.atomic() is now deprecated.

    o	The back-compatibility entry point Rf_log1p in standalone
	Rmath has been removed.


BUG FIXES

    o	ARMAacf() sometimes gave too many results or failed if `lag.max'
	was used.

    o	termplot() with a subset of terms now gives correct partial residuals

    o	Functions anova.glm(), contrasts(), getS3method(), glm() and
	make.tables() were applying get() without asking for a
	function and/or not starting the search in the environment of
	the caller.

    o	as.data.frame.matrix() ignored the `row.names' argument.

    o	as.data.frame.list(optional = TRUE) was converting names, and
	hence data.frame(list(...), check.names = FALSE) was.  (PR#3280)

    o	as.dist(m) {mva} now obeys `diag=TRUE' or `upper=TRUE' in all cases.

    o	as.double(list()) etc was regarded as an error, because of a
	bug in isVectorizable.

    o	On some platforms the wday component of the result of
	as.POSIXlt() was corrupted when trying to guess the DST offset
	at dates the OS was unable to handle.

    o	ave(x, g) didn't work when `g' had unused levels.

    o	biplot.default() allows xlim and ylim to be set.  (PR#3168)

    o	bgroup with a null (.) delimiter was setting font to Greek.  (PR#3099)

    o	body() and formals() were looking for named functions in
	different places: they now both look starting at the
	environment in which they are called.  Several documentation
	errors for these functions have been corrected.

    o	boxplot() was ignoring cex.axis.  (PR#2628)

    o	cut.POSIXt() now passes on ... to cut.default(), as documented.

    o	crossprod() now works for 1d arrays with unnamed dimnames (PR#4092).

    o	data() sometimes failed with multiple files, as the paths
	variable got corrupted.

    o	data.frame() failed with a nonsensical error message if it
	grabbed row names from an argument that was subsequently
	recycled.  Now they are discarded, with a warning.

    o	data.matrix() was documented to replace factors by their
	codes, but in fact re-coded into the alphabetical ordering of
	the levels.

    o	decompose() with even frequency used an asymmetric moving
	average window.

    o	demo() was using `topic' as a regexp rather than an exact match.

    o	dotchart() now does recycle the `color' argument and better
	documents the `bg' one (PR#4343).

    o	getAnywhere() didn't not correctly check for S3 methods, when
	the generic or the class name contains a "." (PR#4275).

    o	file.copy() ignored the overwrite argument.  (PR#3529)

    o	filter(method="recursive") was unnecessarily requiring the
	time series to be longer than the filter.

    o	format(*, nsmall = m) with m > 0 now returns exponential format
	less often.

    o	get() and exists() were ignoring the `mode' argument for
	variables in base.  The error message for get() now mentions
	the mode requested if not "any".  A bug in setting the NAMED
	field in do_get was fixed.

    o	getS3method(f, cl, optional=TRUE) now returns NULL if `f' does
	not exist.

    o	HoltWinters() would segfault if only gamma was optimized, and
	not converge if gamma=0 and seasonal="mult".

    o	hyperref.cfg now contains definitions for colors it uses.

    o	identify.default() detects zero-length arguments.  (PR#4057)

    o	legend() allows shading without filling again.

    o	legend(x, y, leg) doesn't triple `leg' anymore when it is a call.

    o	Corrected many problems with 0-rank (but not necessarily empty
	model) lm() and glm() fits.

    o	lm.influence() now handles 0-rank models, and names its output
	appropriately.	It also ensures that hat values are not greater
	than one, and rounds values within rounding error of one.

    o	The `method' argument to loess() did not work.	(PR#3332)

    o	lsfit() was returning incorrect residuals for 0-rank fits.

    o	methods("$") and methods("$<-") were failing to find methods.

    o	methods() and getS3method() find methods if the generic
	dispatches on a name other than its own.  (The cases of
	coefficients() and fitted.values() were fixed in 1.7.1.)

    o	model.matrix.default() was throwing an error on 0-term models,
	but now handles them correctly.

    o	Printing `nls' objects misbehaved when `data' was a composite
	expression.

    o	.NotYetImplemented() gave "Error in .NotYet...(): .."

    o	numericDeriv() was failing if the first argument was a name
	rather than a call.  (PR#3746)

    o	pacf() was failing if called on a one-column matrix.

    o	paste() applied to 0-length vectors gave "" not a 0-length vector.

    o	The length of a string specification of par(lty=) is now checked: it
	should be 2, 4, 6 or 8.

    o	Using lty=as.integer(NA) and as.double(NA) were being accepted
	but giving nonsensical results.	 Those are not documented
	valid values for lty.  (PR#3217)

    o	Erroneously calling par(new=TRUE) with no plot was not caught
	and so could result in invalid graphics files.	(PR#4037)

    o	par(tck=) was being interpreted incorrectly.  It is now
	documented in the same way as S, and now behaves as
	documented.  (PR#3504)

    o	plclust() [and hence plot.hclust()] sometimes now uses correct `ylim's
	also in unusual cases.	(PR#4197)

    o	plot.POSIX[cl]t no longer passes col, lty, lwd to axis.POSIXt.

    o	The png(), jpeg(), png() and win.metafile() devices now
	enforce the length limit on the filename.  (PR#3466)

    o	pnorm(x, 1, 0) does not give NaN anymore;
	also, pnorm(x, m, s=Inf) == lim{s -> Inf} pnorm(x,m,s).
	Similar changes for dnorm(), cf PR#1218.

    o	On some machines the internal rounding used in postscript() was
	imperfect, causing unnecessarily verbose output (-0.00 instead of
	0) and problems with make check.

    o	qqnorm()'s result now keeps NAs from its input. (PR#3750)

    o	rank() sometimes preserved and sometimes dropped names.

    o	readBin(what = "foo") didn't convert `what' to its type.  (PR#4043)

    o	reorder.dendrogram() now properly resets the "midpoint" attributes
	such that reorder()ed dendrograms now plot properly.

    o	rmultinom(1,100, c(3, 4, 2, 0,0))[3] was NA. (PR#4431)

    o	sapply() for matrix result does not return list(NULL,NULL) dimnames
	anymore.

    o	scan() now interprets quoting in fields to be skipped.	(PR#4128)

    o	seq.POSIXt(from, to, by="DSTday") was failing or calculating
	the length incorrectly.

    o	sort() and unique.default() were failing on 0-level factors.

    o	step() adds a fuzz for reduction in AIC for 0-df terms.	 (PR#3491)

    o	str(x) gives better output when x is of mode "(".  Its "dendrogram"
	method obeys the `give.attr' argument which now defaults to FALSE.

    o	strwidth(f) and strheight(f) could seg.fault when `f' was a
	function.  The fix [to C-level coerceVector()] now gives an error
	instead of passing through.  This may catch other potential
	problems.

    o	Sweave() reports the chunk number rather than the driver call when
	a try error gets caught.

    o	trunc.POSIXt(x) for 0-length x does not return invalid structures
	anymore.  (PR#3763).

    o	warnings() now returns NULL instead of an error when no warnings
	have occured yet.  (PR#4389)

    o	Using write.table() setting the `dec' argument and with no
	numeric columns failed.	 (PR#3532)

    o	$<- did not duplicate when it needed to.

    o	Recursive indexing of lists had too little error-checking.
	(related to PR#3324)

    o	Removed warning about names in persistent strings when a
	namespace is saved.

    o	Fixed some malformed error messages in the methods package.

    o	pipes were not opening properly when profiling on a Mac OS.
	(PR#1140)

    o	Lapack error messages (PR#3494) and call to DGEQP3 (PR#2867) are
	corrected.

    o	Rd conversion was limiting a file to 1000 pairs of braces,
	without any warning.  Now the limit is 10000, with a warning.
	(PR#3400)

    o	In the tcltk package, the tkimage.*() commands were defined
	nonsensically as widget commands. They have been redefined to be
	more useful now.

    o	Registered group generics were not being used. (PR#3536)

    o	Subsetting data frames did not always correctly detect that
	non-existent columns were specified.

    o	There are many more checks for over-running internal buffers,
	almost always reporting errors.

    o	Added some buffer overflow checking in gram.y.

    o	Internals for complex assignment did not check that function name
	was a symbol, which could cause a segfault.

    o	Fixed bug in S4 methods dispatch that made local variables in the
	generic visible when executing the body of a method, thus violating
	lexical scope.




	**************************************************
	*						 *
	*	       1.7 SERIES NEWS			 *
	*						 *
	**************************************************


		CHANGES IN R VERSION 1.7.1


NEW FEATURES

    o	The help pages give appropriate references to the Blue,
	White or Green books for functions based on the descriptions
	of S functions given there. (E&OE)

    o	Function getAnywhere() can find non-exported objects, for
	namespaces or registered methods.


DEPRECATED & DEFUNCT

    o	The (unimplemented) argument 'white' of parse() is deprecated.

    o	The tkfilefind demo in the tcltk library is deprecated, since
	it never worked well, and apparently not at all with Tcl/Tk 8.4.


BUG FIXES

    o	print.table() used too much white space in some cases in 1.7.0.

    o	selectMethod() failed if `f' was a non-generic and
	optional=TRUE, and gave a confusing error message if
	optional=FALSE.

    o	pchisq(*, ncp) and qchisq(*, ncp) work in more cases for large ncp
	or quantile and give warning or error messages otherwise.

    o	str(x) now also works when x is an "externalptr" (or "weakref").

    o	rbeta(), rf(), and rt() now support infinite parameter values;
	other distributions return NaN instead of NA for such.

    o	Redefining a class is now safer if the new definition
	generates an error (previously some invalid metadata could be
	left behind).

    o	A number of errors are now caught in setClass() that
	previously either went unchecked or waited until new() to
	appear:
	- classes may not contain themselves, directly or indirectly;
	- classes appearing either as slots or as superclasses must
	  themselves be defined;
	- slot names (direct or inherited) must be unique.
	In related changes, prototype() now works as documented, and is the
	recommended way to provide prototype objects.

    o	Sorting an ordered factor would return an unordered one.
	This caused some trouble with panel.superpose (PR#974).

    o	methods() could return duplicates if a method in a namespace
	was both exported and registered.

    o	The internal zip.unpack() could crash if more than 500 files
	were to be extracted. (PR#2818)

    o	The "r+" and "r+b" modes of opening file connections disallowed
	writing.

    o	library() now warns the user if the chosen package name
	doesn't match the internal package name, and corrects the
	error. (PR#2816)

    o	qr(LAPACK=TRUE) (and qr for complex arguments) might have failed
	to pivot for rank-deficient inputs. (PR#2867)

    o	Only re-mapped symbols are exported by regex.o, to avoid
	problems with embedded R on RedHat 9.

    o	arima() did not set transform.pars to FALSE if AR parameters
	were fixed, although it claimed to.

    o	pnorm() was slower than necessary in the outer tails in some
	cases due to a typo in the improvements from PR#699.  (PR#2883)

    o	setGeneric() and setMethod() now catch some examples where the
	generic and the method have different argument lists; the
	evaluator checks for internal consistency of these argument lists.

    o	expand.grid(x) {the rare case of one argument} now treats factor
	levels as in the typical case of two or more arguments.

    o	Some implicit coercions to lists could cause segfaults, e.g.
	  x <- matrix(nrow=20000, ncol=20); x$any <- numeric(0)
	due to a PROTECT bug. (PR#2923)

    o	The replacement functions for colnames() and rownames() did not
	work for arrays with more than two dimensions.	They could
	create dimnames of the form list(NULL, NULL) rather than
	remove the dimnames attribute.

    o	termplot() gave incorrect answers with rug=TRUE or
	partial=TRUE for factors whose levels were not in
	lexicographical order.

    o	A serious performance flaw in as() computations was fixed (the
	methods were not being cached properly.)

    o	model.frame(~1, data) always returned 1 row. (PR#2958)

    o	The data editor was truncating objects to 65535 rows.  Pro
	tem, editing objects with more than 65535 rows is an error,
	and objects cannot be extended beyond that row. This restriction
	will be removed in 1.8.0.  (PR#2962)

    o	A bug could produce apparent loops in formal method selection
	when inheritance was restricted (used for the as() function).
	A related problem sometimes broke attaching a package that had
	methods for basic functions, such as names(), used in method
	selection.

    o	Empty expressions as in return(x,) could generate subsequent
	segfaults: they are now errors.	 (PR#2880)

    o	The Kinderman-Ramage Normal Random Generator had several
	problems leading to not-quite normally distributed variates
	(PR#2846).  One problem was traced to an error in the original
	1976 JASA paper!  Thanks to Josef Leydold and his team for
	investigating this. The old generator has been retained for
	reproducibility of older results, under the name
	"Buggy Kinderman-Ramage".  A warning is issued if you select it
	(also indirectly via RNGversion()).

    o	promptMethods() now puts the \alias lines for methods in the
	normal place, near the top of the file, and quotes class
	 names in signatures.

    o	getS3method() and methods() were not finding methods for
	coefficients() and fitted.values() (which dispatch on "coef"
	and "fitted" respectively).

    o	scan() (and hence read.table) was not finding matches for
	separator chars with the upper bit set.	 (PR#3035)

    o	lm.(w)fit failed if the fit had rank 0.

    o	lqs() did not report explicitly that it had failed if all
	samples gave singular fits.

    o	predict.lm(*, se=TRUE) {w/ weights, w/o newdata} now gives correct
	SE's.  (PR#3043)

    o	cor.test(x, y, method="spearman") now also works for
	length(x) > 1290.

    o	Matrices were printed mis-aligned if right=TRUE and na.print
	was specified.	(PR#3058)

    o	R CMD check gives now a clearer message when latex produces
	errors on the package manual.  (PR#3070)

    o	isSeekable() was incorrectly returning FALSE on all file connections.

    o	tkpager() wasn't quite using its title and header arguments in
	the way prescribed by file.show()

    o	legend(*, pch=p, lty=l) now works better when `p' or `l' have
	NAs.

    o	All braces in regular expressions used by Sweave() are now
	escaped by a backslash.

    o	unloadNamespace() failed because getNamespaceImports() now coerces a
	string argument to a name space.

    o	deriv3 gave incorrect Hessians for some very simple
	expressions such as expression(x*y) (since the comments in the
	C code were incorrect).	 (PR#2577)

    o	power.t.test(..., delta=NULL,alternative='two.sided') failed. (PR#2993)

    o	Lines on postscript() plots with thousands of segments might
	have been plotted inaccurately in 1.7.0. (PR#3132)

	Solid lines in postscript() output are split into groups of 1000
	segments to help some PostScript interpreters (typically old
	level-1 interpreters).

    o	cut.POSIXt failed when the breaks were date/time objects. (PR#3181)

    o	Usage of methods in dist.Rd is now correctly documented
	(as.matrix.dist() is not an exported symbol).

    o	The predict() method for ar fits was not retrieving the series
	from the parent environment.

    o	eigen() and La.eigen() were not returning a matrix of
	eigenvectors for a 1x1 input.

    o	hsv() and rgb() now return character(0) when one of their args has
	length 0.  This also fixes terrain.color(1). (PR#3233)

    o	[[<-.data.frame checked if a replacment was too short, but not
	if it was too long.  (related to PR#3229)

    o	qt(x, df) was quite inaccurate for df=1+epsilon; it is now much more
	accurate for df in (1,2) and more precise for other df. (PR#2991)

    o	qbeta() now has slightly improved C code in two places, as suggested
	in the 2nd followup to PR#2894.



		CHANGES IN R VERSION 1.7.0


USER-VISIBLE CHANGES

    o	solve(), chol(), eigen() and svd() now use LAPACK routines
	unless a new back-compatibility option is turned on.  The
	signs and normalization of eigen/singular vectors may change
	from earlier versions.

    o	The `methods', `modreg', `mva', `nls' and `ts' packages
	are now attached by default at startup (in addition to `ctest').
	The option "defaultPackages" has been added which contains the
	initial list of packages.  See ?Startup and ?options for details.
	Note that .First() is no longer used by R itself.

	class() now always (not just when `methods' is attached) gives
	a non-null class, and UseMethod() always dispatches on the
	class that class() returns.  This means that methods like
	foo.matrix and foo.integer will be used.  Functions oldClass()
	and oldClass<-() get and set the "class" attribute as R
	without `methods' used to.

    o	The default random number generators have been changed to
	`Mersenne-Twister' and `Inversion'.  A new RNGversion()
	function allows you to restore the generators of an earlier R
	version if reproducibility is required.

    o	Namespaces can now be defined for packages other than `base':
	see `Writing R Extensions'.  This hides some internal objects
	and changes the search path from objects in a namespace.  All
	the base packages (except methods and tcltk) have namespaces,
	as well as the recommended packages `KernSmooth', `MASS',
	`boot', `class', `nnet', `rpart' and `spatial'.

    o	Formulae are not longer automatically simplified when terms()
	is called, so the formulae in results may still be in the
	original form rather than the equivalent simplified form
	(which may have reordered the terms): the results are now
	much closer to those of S.

    o	The tables for plotmath, Hershey and Japanese have been moved
	from the help pages (example(plotmath) etc) to demo(plotmath) etc.

    o	Errors and warnings are sent to stderr not stdout on
	command-line versions of R (Unix and Windows).

    o	The R_X11 module is no longer loaded until it is needed, so
	do test that x11() works in a new Unix-alike R installation.


NEW FEATURES

    o	if() and while() give a warning if called with a vector condition.

    o	Installed packages under Unix without compiled code are no
	longer stamped with the platform and can be copied to other
	Unix-alike platforms (but not to other OSes because of
	potential problems with line endings and OS-specific help files).

    o	The internal random number generators will now never return
	values of 0 or 1 for runif.  This might affect simulation
	output in extremely rare cases.	 Note that this is not
	guaranteed for user-supplied random-number generators, nor
	when the standalone Rmath library is used.

    o	When assigning names to a vector, a value that is too short is
	padded by character NAs. (Wishlist part of PR#2358)

    o	It is now recommended to use the 'SystemRequirements:' field in
	the DESCRIPTION file for specifying dependencies external to the
	R system.

    o	Output text connections no longer have a line-length limit.

    o	On platforms where vsnprintf does not return the needed buffer
	size the output line-length limit for fifo(), gzfile() and
	bzfile() has been raised from 10k to 100k chars.

    o	The Math group generic does not check the number of arguments
	supplied before dispatch: it used to if the default method had
	one argument but not if it had two.  This allows trunc.POSIXt()
	to be called via the group generic trunc().

    o	Logical matrix replacement indexing of data frames is now
	implemented (interpreted as if the lhs was a matrix).

    o	Recursive indexing of lists is allowed, so x[[c(4,2)]] is
	shorthand for x[[4]][[2]] etc.	(Wishlist PR#1588)

    o	Most of the time series functions now check explicitly for a
	numeric time series, rather than fail at a later stage.

    o	The postscript output makes use of relative moves, and so is
	somewhat more compact.

    o	%*% and crossprod() for complex arguments make use of BLAS
	routines and so may be much faster on some platforms.

    o	arima() has coef(), logLik() (and hence AIC) and vcov() methods.

    o	New function as.difftime() for time-interval data.

    o	basename() and dirname() are now vectorized.

    o	biplot.default() {mva} allows `xlab' and `ylab' parameters to
	be set (without partially matching to `xlabs' and `ylabs').
	(Thanks to Uwe Ligges.)

    o	New function capture.output() to send printed output from an expression
	to a connection or a text string.

    o	ccf() (pckage ts) now coerces its x and y arguments to class "ts".

    o	chol() and chol2inv() now use LAPACK routines by default.

    o	as.dist(.) is now idempotent, i.e., works for "dist" objects.

    o	Generic function confint() and `lm' method (formerly in
	package MASS, which has `glm' and `nls' methods).

    o	New function constrOptim() for optimisation under linear inequality
	constraints.

    o	Add `difftime' subscript method and methods for the group
	generics. (Thereby fixing PR#2345)

    o	download.file() can now use HTTP proxies which require `basic'
	username/password authentication.

    o	dump() has a new argument `envir'.  The search for named
	objects now starts by default in the environment from which
	dump() is called.

    o	The edit.matrix() and edit.data.frame() editors can now handle
	logical data.

    o	New argument `local' for example() (suggested by Andy Liaw).

    o	New function file.symlink() to create symbolic file links
	where supported by the OS.

    o	New generic function flush() with a method to flush connections.

    o	New function force() to force evaluation of a formal argument.

    o	New functions getFromNamespace(), fixInNamespace() and
	getS3method() to facilitate developing code in packages with
	namespaces.

    o	glm() now accepts `etastart' and `mustart' as alternative ways
	to express starting values.

    o	New function gzcon() which wraps a connection and provides
	(de)compression compatible with gzip.

	load() now uses gzcon(), so can read compressed saves from
	suitable connections.

    o	help.search() can now reliably match individual aliases and
	keywords, provided that all packages searched were installed
	using R 1.7.0 or newer.

    o	hist.default() now returns the nominal break points, not those
	adjusted for numerical tolerances.

	To guard against unthinking use, `include.lowest' in
	hist.default() is now ignored, with a warning, unless `breaks'
	is a vector.  (It either generated an error or had no effect,
	depending how prettification of the range operated.)

    o	New generic functions influence(), hatvalues() and dfbeta()
	with lm and glm methods; the previously normal functions rstudent(),
	rstandard(), cooks.distance() and dfbetas() became generic.
	These have changed behavior for glm objects -- all originating from
	John Fox' car package.

    o	interaction.plot() has several new arguments, and the legend
	is not clipped anymore by default.  It internally uses axis(1,*)
	instead of mtext().
	This also addresses "bugs" PR#820, PR#1305, PR#1899.

    o	New isoreg() function and class for isotonic regression
	(`modreg' package).

    o	La.chol() and La.chol2inv() now give interpretable error
	messages rather than LAPACK error codes.

    o	legend() has a new `plot' argument.  Setting it `FALSE' gives
	size information without plotting (suggested by U.Ligges).

    o	library() was changed so that when the methods package is
	attached it no longer complains about formal generic functions
	not specific to the library.

    o	list.files()/dir() have a new argument `recursive'.

    o	lm.influence() has a new `do.coef' argument allowing *not* to
	compute casewise changed coefficients.	This makes plot.lm() much
	quicker for large data sets.

    o	load() now returns invisibly a character vector of the names
	of the objects which were restored.

    o	New convenience function loadURL() to allow loading data files
	from URLs (requested by Frank Harrell).

    o	New function mapply(), a multivariate lapply().

    o	New function md5sum() in package tools to calculate MD5
	checksums on files (e.g. on parts of the R installation).

    o	medpolish() {package eda} now has an `na.rm' argument (PR#2298).

    o	methods() now looks for registered methods in namespaces, and
	knows about many objects that look like methods but are not.

    o	mosaicplot() has a new default for `main', and supports the
	`las' argument (contributed by Uwe Ligges and Wolfram Fischer).

    o	An attempt to open() an already open connection will be detected
	and ignored with a warning.  This avoids improperly closing
	some types of connections if they are opened repeatedly.

    o	optim(method = "SANN") can now cover combinatorial optimization
	by supplying a move function as the `gr' argument (contributed
	by Adrian Trapletti).

    o	PDF files produced by pdf() have more extensive information
	fields, including the version of R that produced them.

    o	On Unix(-alike) systems the default PDF viewer is now determined
	during configuration, and available as the 'pdfviewer' option.

    o	pie(...) has always accepted graphical pars but only passed
	them on to title().  Now pie(, cex=1.5) works.

    o	plot.dendrogram (`mva' package) now draws leaf labels if present
	by default.

    o	New plot.design() function as in S.

    o	The postscript() and PDF() drivers now allow the title to be set.

    o	New function power.anova.test(), contributed by Claus Ekstrom.

    o	power.t.test() now behaves correctly for negative delta in the
	two-tailed case.

    o	power.t.test() and power.prop.test() now have a `strict'
	argument that includes rejections in the "wrong tail" in the
	power calculation. (Based in part on code suggested by Ulrich
	Halekoh.)

    o	prcomp() is now fast for n x m inputs with m >> n.

    o	princomp() no longer allows the use of more variables than
	units: use prcomp() instead.

    o	princomp.formula() now has principal argument `formula', so
	update() can be used.

    o	Printing an object with attributes now dispatches on the
	class(es) of the attributes. See ?print.default for the fine
	print. (PR#2506)

    o	print.matrix() and prmatrix() are now separate functions.
	prmatrix() is the old S-compatible function, and
	print.matrix() is a proper print method, currently identical
	to print.default().  prmatrix() and the old print.matrix()
	did not print attributes of a matrix, but the new print.matrix()
	does.

    o	print.summary.{lm,glm} now default to symbolic.cor = FALSE, but
	symbolic.cor can be passed to the print methods from the
	summary methods.  print.summary.{lm,glm} print correlations to
	2 decimal places, and the symbolic printout avoids abbreviating
	labels.

    o	If a prompt() method is called with 'filename' as 'NA', a
	list-style representation of the documentation shell generated
	is returned.  New function promptData() for documenting objects
	as data sets.

    o	qqnorm() and qqline() have an optional logical argument
	`datax' to transpose the plot (S-PLUS compatibility).

    o	qr() now has the option to use LAPACK routines, and the
	results can be used by the helper routines qr.coef(), qr.qy()
	and qr.qty().  The LAPACK-using versions may be much faster
	for large matrices (using an optimized BLAS) but are less
	flexible.

    o	QR objects now have class "qr", and solve.qr() is now just the
	method for solve() for the class.

    o	New function r2dtable() for generating random samples of two-way
	tables with given marginals using Patefield's algorithm.

    o	rchisq() now has a non-centrality parameter `ncp', and there's a
	C API for rnchisq().

    o	New generic function reorder() with a dendrogram method;
	new order.dendrogram() and heatmap().

    o	require() has a new argument, character.only,
	  -- to make it align with library.

    o	New functions rmultinom() and dmultinom(), the first one with
	a C API.

    o	New function runmed() for fast runnning medians (`modreg' package).

    o	New function slice.index() for identifying indexes with respect
	to slices of an array.

    o	solve.default(a) now gives the dimnames one would expect.

    o	stepfun() has a new `right' argument for right-continuous step
	function construction.

    o	str() now shows ordered factors different from unordered ones.
	It also differentiates "NA" and as.character(NA), also for factor
	levels.

    o	symnum() has a new logical argument `abbr.colnames'.

    o	summary(<logical>) now mentions NA's as suggested by
	Goran Brostrom.

    o	summaryRprof() now prints times with a precision appropriate
	to the sampling interval, rather than always to 2dp.

    o	New function Sys.getpid() to get the process ID of the R session.

    o	table() now allows exclude= with factor arguments (requested by
	Michael Friendly).

    o	The tempfile() function now takes an optional second argument
	giving the directory name.

    o	The ordering of terms for terms.formula(keep.order=FALSE) is
	now defined on the help page and used consistently, so that
	repeated calls will not alter the ordering (which is why
	delete.response() was failing: see the bug fixes).  The
	formula is not simplified unless the new argument `simplify'
	is true.

    o	added "[" method for terms objects.

    o	New argument `silent' to try().

    o	ts() now allows arbitrary values for y in start/end = c(x, y):
	it always allowed y < 1 but objected to y > frequency.

    o	unique.default() now works for POSIXct objects, and hence so
	does factor().


    o	Package tcltk now allows return values from the R side to the
	Tcl side in callbacks and the R_eval command. If the return
	value from the R function or expression is of class "tclObj"
	then it will be returned to Tcl.

    o	A new HIGHLY EXPERIMENTAL graphical user interface using the tcltk
	package is provided. Currently, little more than a proof of concept.
	It can be started by calling "R -g Tk" (this may change in later
	versions) or by evaluating tkStartGUI(). Only Unix-like systems
	for now. It is not too stable at this point; in particular, signal
	handling is not working properly.


    o	Changes to support name spaces:

	- Placing base in a name space can no longer be disabled by
	  defining the environment variable R_NO_BASE_NAMESPACE.

	- New function topenv() to determine the nearest top level
	  environment (usually .GlobalEnv or a name space environment).

	- Added name space support for packages that do not use methods.

    o	Formal classes and methods can be `sealed', by using the
	corresponding argument to setClass or setMethod.  New
	functions isSealedClass() and isSealedMethod() test sealing.

    o	packages can now be loaded with version numbers. This allows
	for multiple versions of files to be installed (and potentially
	loaded). Some serious testing will be going on, but it should
	have no effect unless specifically asked for.


INSTALLATION CHANGES

    o	TITLE files in packages are no longer used, the Title field
	in the DESCRIPTION file being preferred.  TITLE files will be
	ignored in both installed packages and source packages.

    o	When searching for a Fortran 77 compiler, configure by default
	now also looks for Fujitsu's frt and Compaq's fort, but no
	longer for cf77 and cft77.

    o	Configure checks that mixed C/Fortran code can be run before
	checking compatibility on ints and doubles: the latter test
	was sometimes failing because the Fortran libraries were not
	found.

    o	PCRE and bzip2 are built from versions in the R sources if the
	appropriate library is not found.

    o	New configure option --with-lapack to allow high-performance
	LAPACK libraries to be used: a generic LAPACK library will be
	used if found.	This option is not the default.

    o	New configure options --with-libpng, --with-jpeglib, --with-zlib,
	--with-bzlib and --with-pcre, principally to allow these
	libraries to be avoided if they are unsuitable.

    o	If the precious variable R_BROWSER is set at configure time
	it overrides the automatic selection of the default browser.
	It should be set to the full path unless the browser appears
	at different locations on different client machines.

    o	Perl requirements are down again to 5.004 or newer.

    o	Autoconf 2.57 or later is required to build the configure
	script.

    o	Configure provides a more comprehensive summary of its results.

    o	Index generation now happens when installing source packages
	using R code in package tools.	An existing 'INDEX' file is used
	as is; otherwise, it is automatically generated from the \name
	and \title entries in the Rd files.  Data, demo and vignette
	indices are computed from all available files of the respective
	kind, and the corresponding index information (in the Rd files,
	the 'demo/00Index' file, and the \VignetteIndexEntry{} entries,
	respectively).	These index files, as well as the package Rd
	contents data base, are serialized as R objects in the 'Meta'
	subdirectory of the top-level package directory, allowing for
	faster and more reliable index-based computations (e.g., in
	help.search()). For vignettes an HTML index is generated
	and linked into the HTML help system.

    o	The Rd contents data base is now computed when installing source
	packages using R code in package tools.	 The information is
	represented as a data frame without collapsing the aliases and
	keywords, and serialized as an R object.  (The 'CONTENTS' file
	in Debian Control Format is still written, as it is used by the
	HTML search engine.)

    o	A NAMESPACE file in root directory of a source package is copied
	to the root of the package installation directory.  Attempting to
	install a package with a NAMESPACE file using --save signals an
	error; this is a temporary measure.

    o	The defaults for configure for Darwin systems is
	--with-blas='-framework vecLib' --with-lapack --with-aqua
	that by default builds R as a framework and installs it in
	/Library/Frameworks as R.framework. Then, make install just
	installs the R.framework in /Library/Frameworks unless specified
	at configure time using the -enable-R-framework=[DIR] or using
	the --prefix flag at installation time.

DEPRECATED & DEFUNCT

    o	The assignment operator `_' will be removed in the next
	release and users are now warned on every usage: you may even see
	multiple warnings for each usage.

	If environment variable R_NO_UNDERLINE is set to anything of
	positive length then use of `_' becomes a syntax error.

    o	machine(), Machine() and Platform() are defunct.

    o	restart() is defunct.  Use try(), as has long been recommended.

    o	The deprecated arguments `pkg' and `lib' of system.file() have
	been removed.

    o	printNoClass() {methods} is deprecated (and moved to base,
	since it was a copy of a base function).

    o	Primitives dataClass() and objWithClass() have been replaced
	by class() and class<-(); they were internal support functions
	for use by package methods.

    o	The use of SIGUSR2 to quit a running R process under Unix is
	deprecated, the signal may need to be reclaimed for other
	purposes.


UTILITIES

    o	R CMD check more compactly displays the tests of DESCRIPTION
	meta-information.  It now reports demos and vignettes without
	available index information.  Unless installation tests are
	skipped, checking is aborted if the package dependencies cannot
	be resolved at run time.  Rd files are now also explicitly
	checked for empty \name and \title entries.  The examples are
	always run with T and F redefined to give an error if used
	instead of TRUE and FALSE.

    o	The Perl code to build help now removes an existing example
	file if there are no examples in the current help file.

    o	R CMD Rdindex is now deprecated in favor of function Rdindex()
	in package tools.

    o	Sweave() now encloses the Sinput and Soutput environments of
	each chunk in an Schunk environment. This allows to fix some
	vertical spacing problems when using the latex class slides.


C-LEVEL FACILITIES

    o	A full double-precision LAPACK shared library is made
	available as -lRlapack.	 To use this include
	$(LAPACK_LIBS) $(BLAS_LIBS) in PKG_LIBS.

    o	Header file R_ext/Lapack.h added.  C declarations of BLAS
	routines moved to R_ext/BLAS.h and included in R_ext/Applic.h
	and R_ext/Linpack.h for backward compatibility.

    o	R will automatically call initialization and unload routines, if
	present, in shared libraries/DLLs during dyn.load() and
	dyn.unload() calls. The routines are named R_init_<dll name>
	and R_unload_<dll name>, respectively.	See the Writing R
	Extensions Manual for more information.

    o	Routines exported directly from the R executable for use with
	.C(), .Call(), .Fortran() and .External() are now accessed via
	the registration mechanism (optionally) used by packages.  The
	ROUTINES file (in src/appl/) and associated scripts to
	generate FFTab.h and FFDecl.h are no longer used.

    o	Entry point Rf_append is no longer in the installed headers
	(but is still available).  It is apparently unused.

    o	Many conflicts between other headers and R's can be avoided by
	defining STRICT_R_HEADERS and/or R_NO_REMAP -- see `Writing R
	Extensions' for details.

    o	New entry point R_GetX11Image and formerly undocumented
	ptr_R_GetX11Image are in new header R_ext/GetX11Image.	These
	are used by package tkrplot.


BUG FIXES

    o	The redefinition of the internal do_dataentry by both the aqua and X11
	modules, casued a bus error when launching R without the --gui=aqua option
	under X11 using a version of R built to use the aqua module. This has
	now been fixed. (PR#6438)

    o	Sys.sleep() on Unix was having trouble with waits of less than 0.5s

    o	The fix to PR#2396 broke read.table() on files with CR line
	endings. (PR#2469)   Separate problem with this on Carbon Mac OS
	build fixed as well.

    o	Converting Sweave files to noweb syntax using SweaveSyntConv()
	was broken.

    o	Printing numbers near the minimum could get the number of
	significant figures wrong due to underflow: for example 4e-308
	might print as 4.00000e-308.  (Seen on some Windows builds,
	and also on numbers around 1e-317 on Linux.)

    o	wilcox.test() could give integer overflow warnings on very long
	vectors.  Also added tests for numeric inputs, as per the help
	page.  (PR#2453)

    o	Printing unquoted character vectors containing escape
	characters was computing the wrong length and hence
	misaligning names.  This was due to a bug in Rstrlen which
	might have had other effects.

    o	if(logical(0)) and while(logical(0)) now report zero length,
	not `missing value where logical is needed'.

    o	The gaussian() and inverse.gaussian() families were documented
	to allow only one link, which has not been true in R for at
	least four years.

    o	prmatrix() forced conversion to character if `na.print' was
	used, and that conversion neither respected `digits' nor
	`quote'.

    o	Rprof() might give misleading results for too small values of
	`interval' and in practice the default 20ms was about as small
	as is advisable on Linux.  Now the interval is forced to be at
	least one clock tick.

    o	summary.data.frame() was not giving interpretable results when
	the data frame contained a data frame as a column. (PR#1891)

    o	delete.response() might re-order the rhs terms so prediction
	might fail or even give incorrect results. (PR#2206)

    o	StructTS() now accepts numeric time series of integer storage mode.

    o	all(), any() now handle NAs as documented.

    o	Subsetting arrays to a result with 0 dimension(s) failed if
	the array had dimnames. (PR#2507)

    o	If the call to data.frame() included 0-row arguments, it tried
	to replicate them to the maximum number of rows, and failed if
	this was 1 or more.

    o	replicate() now understands data frames to which na.omit() has
	been applied.

    o	is.ts() was too liberal: a time series must have at least one point.

    o	methods() was sorting by package, not by name.

    o	symbols(thermometers=) was often giving a spurious warning about
	the range.

    o	tcltk was using deprecated internals of the Tcl library when
	accessing error messages.  Not likely to be a user-visible
	change.

    o	The automatic search for BLAS libs now tries Sun's libsunperf
	the way the latest versions require. (PR#2530)

    o	str(array(1)) now does show the array.
	str(Surv(...)) now works again.

    o	step(), add1.default() and drop1.default() now work somewhat
	better if called from a function.

    o	page() was searching from the wrong environment, and so
	searching base before the workspace.

    o	crossprod(Z) for complex Z was returning nonsense.

    o	La.chol2inv() gave incorrect results unless the matrix was square.

    o	When the POSIXt date functions were required to guess DST,
	they sometimes guessed correctly that DST was in force but
	converted a POSIXlt time as if standard time was given.

    o	c/rbind were not handling zero col/row matrices correctly.
	(PR#2541 was one symptom.)

    o	approx() and approxfun() now work with 1 knot if
	method = "constant".  stepfun(), ecdf() and plot.stepfun() do so
	as well.

    o	AIC.lm/default was failing if multiple objects and k were
	specified.  (PR#2518)

    o	removeMethods{methods} was broken. (PR#2519)

    o	summary.glm() had two `aic' components in the returned object.

    o	autoload() was returning the value of its last command, a
	promise, even though it was documented to have no value.
	As a result some packages (e.g. nlme) were loading packages
	they meant to autoload.

    o	Fixes to methods and classes:
	   - show() is consistent with using setOldClass for S3 classes.
	   - several problems with the coerce and replace methods
	     generated by setIs have been fixed.
	   - more thorough tests & informative messages for invalid
	     `def' arguments to setGeneric
	   - setGeneric will now create the generic function even when
	     a generic of the same name already exists (it does issue
	     a warning).

    o	unz() connections could no longer be opened. (PR#2579)

    o	unique(ordered factor) returned an unordered factor. (PR#2591)

    o	x[] <- value coerced x to the mode of value if and only if x
	had length 0!  (Should only happen if x is null: PR#2590)

    o	lm() mislabelled the cols of the qr decomposition. (cause of PR#2586)

    o	data() looks for file extensions in an order prescribed in the
	help file: previously whether foo.R or foo.csv was used was
	locale-dependent.

    o	sys.function() now returns the actual function being evaluated in
	the specified frame rather than one inferred from the call.

    o	match.call() now uses the definition of the actual function being
	evaluated rather than one inferred from the call.

    o	abbreviate(*, dot = TRUE) now only adds a "." where abbreviations
	did happen.

    o	Changing timezones in the POSIXt functions was not working on
	some Linux systems, and this has been corrected.

    o	ks.test() in package ctest had numerical problems in the lower
	tail of the asymptotic distribution (PR#2571).

    o	Sweave() now handles empty chunks at the end of files correctly.

    o	[<-() lost the object bit if coercion was involved.

    o	package::object wasn't being deparsed properly.

    o	seq.POSIXt() with `by' an object of class "difftime" ignored
	the units.

    o	rank(c("B", NA)) no longer returns character.

    o	reference to by() added in ?tapply

    o	?lm describes what happens with matrix response

    o	The X11 device has improved event handling. In particular it
	used to often miss the last of a series of resize events.

    o	lm.influence() and related functions now work again for the
	multivariate case and when there are zero weights.

    o	format( <character> ) now always keeps names and dimnames.

    o	table(factor(c(2,NA), exclude=NULL)) prints better now.

    o	predict(foo, type = "terms") and hence
	residuals(foo, type = "partial") now work for lm and glm objects
	with weights zero.  Further, model.matrix() is now only called once.

    o	R CMD config now works correctly when called from a Makefile
	using GNU make.

    o	The data.frame method for rbind() was
	- converting character columns to factors,
	- converting ordered factor columns to unordered factors,
	- failing to append correctly a factor to a character column
	  and vice versa.

    o	as.hclust.twins() now does provide proper `labels', `method' and
	`call' components.

    o	cycle() sometimes failed on a time series which started at a cycle
	other than 1.

    o	read.dcf() read incorrectly files which did not end in a new line.

    o	read.socket() dropped certain non-alphanumeric characters. (PR#2639)

    o	termplot() handles missing data better (PR#2687,
	 <Mark.Bravington@csiro.au>)

    o	Corrected MacRoman encoding for Icircumflex etc.



	**************************************************
	*						 *
	*	       1.6 SERIES NEWS			 *
	*						 *
	**************************************************


		CHANGES IN R VERSION 1.6.2


BUG FIXES

    o	plot.stepfun() now obeys a `ylim=.' specification.

    o	removeClass() does a better job of removing inheritance
	information.

    o	setIs() will not allow mismatched representations between two
	classes (without an explicit coerce method).

    o	The code underlying polygon drawing contained a memory leak.
	This showed up in persp, but did not affect other graphics
	functions.  It is now possible to draw big DEMs.

    o	logLik.nls() gave wrong df. (PR#2295)

    o	rbind() with a mixture of data frames and matrices treated the
	matrices as vectors. (PR#2266)

    o	stripchart(method="stack") was not handling missing values. (PR#2018)

    o	Arithmetic functions such as log() lost the object bit from
	classed objects if coercion was needed. (PR#2315)

    o	exp_rand would go into an infinite loop if unif_rand returned 0.

    o	formatC(x, format="fg") could return exponential format if
	rounding pushed x over a positive power of 10. (PR#2299)

    o	attr(x, foo) used partial matching for `foo' (even though not
	documented to do so), and failed to find `foo' if there were
	two or more partial matches before the exact match in the list
	of attributes.

    o	Rdconv now creates direct HTML hyperlinks when linking to
	documentation in the same package.  The code now ensures that
	links which can be resolved within the package are so resolved,
	even when there are possible resolutions in other packages.

    o	If readBin(what=character()) is used incorrectly on a file which
	does not contain C-style character strings, warnings (usually
	many) are now given.

    o	Building libR.so with the zlib in the R sources was not
	finding the local zlib headers.

    o	system(intern=TRUE) has an undocumented line length limit of
	119 chars both on Unix and Windows.  The limit is now 8096 and
	documented.  On Unix (only) every 120th character used to be
	discarded.

    o	plot.POSIX[cl]t were not passing graphics parameters on to
	axis.POSIXct.

    o	On some HP-UX systems, installed scripts were not executable
	when using the BSD-compatible install system program found by
	configure.  We now always use install-sh on HP-UX. (PR#2091)

    o	c() was converting NA names to "NA": now proper NA strings are
	used wherever possible. (PR#2358)

    o	Checks in the C code prevent possible memory faults when
	standardGeneric is called invalidly.

    o	Macros NEW_OBJECT (aka NEW) and MAKE_CLASS added; required by
	the .Call interface to generate arbitrary objects.

    o	A typo was causing segfaults when using data.entry under SuSE.

    o	mostattributes<-() was failing to copy across dimnames when
	one component was NULL, affecting pmax() and pmin() when the
	first argument was a matrix.  (root cause of PR#2357)

    o	The pdf() device now initialises graphical parameters
	properly.  (PR#2281)

    o	Checks in the C code prevent possible memory faults when
	standardGeneric is called invalidly.

    o	Macros NEW_OBJECT (aka NEW) and MAKE_CLASS added; required by
	the .Call interface to generate arbitrary objects.

    o	Problem that prevented package tcltk from working with Tcl/Tk
	8.4 (crash on initialization) resolved.	 (Notice that binaries
	may still require an older Tcl/Tk, for example on Windows).

    o	type.convert() was not getting the levels right if passed a
	character vector containing <NA>s, and `na.strings' did not
	contain "NA".  This affected read.table().

    o	Internal match function did not check for nor handle 0-length
	vectors.  (The R function match() did.)	 This could cause
	type.convert() to segfault.

    o	The line length limit in output text connections has been
	raised to 8095 chars.

    o	Sweave now uses anonymous file rather than text connections
	to avoid the limits of the latter (see previous item).

    o	parsing did not work on connections when pushback was used (as
	it had never been implemented).	 (PR#2396)

    o	max.col() only found NAs in the first column (typo).

    o	Added a workaround for recent versions of glibc (e.g. RedHat 8.0)
	with inconsistent mktime/localtime functions which caused
	conversion to/from POSIXct times prior to 1970-01-01 to be
	inconsistent.  On such platforms this is a run-time test to
	allow e.g. R compiled on RH7.2 to run on RH8.0.

    o	Clipping was not being reset properly between plots on the gtk()
	device (the default under the GNOME interface). (PR#2366)

    o	axis(*, fg= cc) now works (again) the same as axis(*, col = cc).



		CHANGES IN R VERSION 1.6.1


NEW FEATURES

    o	Added a few "trivial and obviously missing" functions to tcltk:
	tkchooseDirectory, tkpopup, tkdialog, tkread

    o	barplot() has a new argument `axis.lty', which if set to 1
	allows the pre-1.6.0 behaviour of plotting the axis and tick
	marks for the categorical axis.	 (This was apparently not
	intentional, but axis() used to ignore lty=0.)
	The argument `border' is no longer ".NotYetUsed".


BUG FIXES

    o	hist(<datetime>, cex.axis = f)	now works for x-axis too.

    o	prompt() gave wrong \usage{.} for long argument default expressions.

    o	summary(x) gives more information when `x' is a logical
	(or a data frame with a logical column which is now quite customary).

    o	seq.POSIXt(from, to, length.out= . ) could give too long results

    o	summaryRprof() was counting nested calls to the same function
	twice.

    o	Printing of objects of mode "expression" did strange things if
	there were "%" characters in the deparsed expression (PR#2120).

    o	as.matrix.data.frame converted missings to "NA" not character NA.
	(PR#2130)

    o	spec.pgram() was only interpolating zero freq for one series. (PR#2123)

    o	help(randu) had % unescaped in the example. (PR#2141)

    o	Making html links would fail if packages-head.html was not
	writable. (PR#2133)

    o	Sweave.sty was not installed to $R_HOME/share/texmf when
	builddir != srcdir. On Windows backslashes in latex paths have
	to be replaced by slashes.

    o	A memory leak in deparsing was introduced when eliminating
	static variables (thanks to Achim Zeileis for spotting this).
	A similar problem in loading workspaces has been corrected.

    o	TclInterface.Rd incorrectly used \synopsis for \usage so that
	the usage section wasn't output.

    o	Readline stack off-by-one error. (PR#2165)

    o	R_ExpandFileName had a memory leak in the case libreadline was
	used under Unix-alikes.

    o	sys.save.image() now closes all connections so it will work even
	if the connection list has become full.

    o	loess() had an unstated limit of four predictors: this is now
	documented and enforced.

    o	${R_HOME}/etc/Renviron.site is now not read if R_ENVIRON is
	set, as documented.  Previously it was read unless R_ENVIRON
	pointed to an actual file.

    o	Startup.Rd described the processing under Unix-alikes but
	incorrectly implied it happened that way on the Windows and
	Mac OS ports.  Neither use Renviron.site, for example.

    o	besselK(x,*) now returns 0 instead of Inf for large x. (PR#2179)

    o	The Tcl console code didn't work with Tcl/TK 8.0, and has been
	#ifdef'd out.  (PR#2090)

    o	format.AsIs() was not handling matrices.

    o	sd() was not passing na.rm to var() for matrices and data frames.

    o	dist() {mva} silently treated +/-Inf as NA.

    o	setwd() now returns NULL invisibly.

    o	basename() and dirname() did not check the length of their
	input and ignored elements after the first.  This affected
	undoc {tools}.

    o	If A had dimnames, eigen(A) had inappropriate dimnames. (PR#2116)

    o	as.POSIXct.dates had a sign error for the origin (PR#2222)

    o	The claim that pie charts should be avoided (in pie.Rd) is now
	supported by a quote from Cleveland (1985).

    o	The vsnprintf() functions supplied for systems that don't
	supply their own had a bug in the output of fractional parts,
	corrupting data if using save() with ascii=TRUE. (PR#2144)

    o	pretty() values close to 0 in some cases which are now 0 (PR#1032
	and D.Brahm's mails).

    o	factor.scope() was giving an error rather than a reasonable
	default in some cases when it was called incorrectly (e.g. via
	incorrect formula in add1()).


BUILD ISSUES

    o	Toplevel Makefile was missing dependency of "docs" on "R" (causing
	parallel makes to go wrong)

    o	When building with recommended packages those were installed
	into the first path in R_LIBS, if the environment variable was
	present.



		CHANGES IN R VERSION 1.6.0


USER-VISIBLE CHANGES

    o	The default colour palette now has "grey" instead of "white"
	in location 8.	See palette().

    o	grid(nx) behaves differently (but the same as in R versions <= 0.64).


NEW FEATURES

    o	New operator :: in the grammar, for name spaces.

    o	New faster rowsum(), also works on data frames.

    o	grep(), (g)sub() and regexpr() have a new argument `perl'
	which if TRUE uses Perl-style regexps from PCRE (if installed).
	New capabilities option "PCRE" to say if PCRE is available.

    o	Preparations for name space support:

	- Functions in the base package are now defined in a name space.
	  As a temporary measure, you can disable this by defining the
	  environment variable R_NO_BASE_NAMESPACE.

	- UseMethod dispatching now searches for methods in the
	  environment of the caller of the generic function rather
	  than the environment where the generic is defined.

    o	The objects created in the methods package to represent
	classes, generic functions, method definitions, and
	inheritance relations now themselves belong to true classes.  In
	particular, the "classRepresentation" objects follow the description
	in "Programming with Data" (section 7.6).

    o	Other additions and changes to the methods package:

	- The function setOldClass() has been added, following the
	  description on page 450 of "Programming with Data".  Use it
	  if old-style classes are to be supplied in signatures for
	  setMethod, particularly if the old-style classes have
	  inheritance.	Many of the old-style classes in the base
	  package should be pre-specified; try getClass("mlm"), e.g.

	- The setGeneric() function applies some heuristics to warn
	  about possibly erroneous generic function definitions.
	  (Before, obscure bugs could result.)

	- The function promptMethods() has been revised to work better
	  and to provide aliases for individual methods.

	- The behavior of the as() function has been generalized, in
	  particular with a strict= argument, the general goal being
	  to let simple extensions of classes pass through in method
	  dispatch and related computations without altering the
	  objects. More to make method behavior more "natural" than
	  for direct use.

	- Some inconsistencies following detach("package:methods")
	  have been removed, so it _should_ be possible to
	  detach/re-attach the methods package.

    o	New methods ([[, print, str) and extended plot() method
	(incl. logical `horiz') for "dendrogram" class.

    o	sprintf() now checks the agreement between formats and object
	types, and handles special values (NA, Inf, ...) correctly.

    o	chol() now uses a tolerance for non-positive-definiteness and
	so should give more consistent results across platforms.

    o	New function agrep() for approximate (fuzzy) string matching.

    o	help.search() can now use both approximate (fuzzy) and regular
	expression matching.  By default, if the pattern to be matched
	consists of only alphanumeric characters, whitespace or a dash,
	approximate matching is used.

    o	axis() has three new optional arguments `col', `lty', and `lwd'
	all for drawing the axis line and tick marks.

    o	Function vcov() (formerly in MASS), a generic function to
	return the variance-covariance matrix of the parameter
	estimates of a fitted model.

    o	duplicated() and unique() have methods for matrices and arrays
	(based on ideas from Jens Oehlschlaegel).

    o	Internally memory sizes and counts of cons cells are now stored
	in unsigned longs.  This allows memory limits to be set and
	objects created in the range 2-4Gb on 32-bit platforms, and
	allows 64-bit platforms to use much larger amounts of memory.

    o	Command-line flags to set memory can now use the suffix `G'
	for gigabytes.	The setting of maximum vsize is now only
	limited by the platform's address space.

    o	All warning and error messages are truncated to a length set
	by options(warning.length=), defaulting to 1000.  (Previously
	most (but not quite all) were truncated at 8192 characters.)

    o	[dpqr]gamma() check for shape parameter > 0.

    o	as.POSIX[cl]t can now convert logical NAs.

    o	All installed packages (even those shipped with R) are
	given a `Built' field in the DESCRIPTION file.

    o	as.data.frame() now coerces logical matrices into logical
	columns (rather than factors).

    o	[[<-.data.frame no longer coerces character replacement values
	to factor.  This is consistent with using $ to replace and
	with S4.

    o	library() attempts to detect improperly installed packages, so
	as from this version an installed package must have a
	DESCRIPTION file and that file must have been stamped with a
	`Built:' line (which was introduced in 1.2.0).	Under
	Unix-alikes, the platform is checked against that used for
	installation.

    o	print.factor() has new arguments `max.levels' (with a smart default)
	and `width'.  print.ordered() is no longer needed.

    o	RNGkind() has an additional option for normal random generators:
	"Inversion".

    o	data.frame() recycles factors and "AsIs" objects as well as
	atomic vectors.

    o	predict.lm() warns if `newdata' is supplied and the fit was
	rank-deficient, as this can be misleading.

    o	rect() accepts additional graphics parameters through a ...
	argument (in the same way as polygon).

    o	strwidth/strheight() now coerce their first argument in exactly
	the same way text() does, so a wider range of inputs is allowed.

    o	prompt()'s default and data.frame methods have a new 3rd argument
	`name' allowing them to used more easily in scripts and loops.

    o	rgb() has a new `maxColorValue' argument, allowing r,g,b in [0,M],
	particularly in {0:255}, efficiently and non-error-prone.

    o	summaryRprof() provides the functionality of R CMD Rprof in R
	code, though more slowly.

    o	stop() accepts multiple arguments (which are concatenated)
	just as warning() does.

    o	scan() now throws an error with incorrect logical input (which
	was previously taken as FALSE).

    o	pdf() now uses PDF not R code for clipping, which ensures that
	partially visible text strings are (partially) shown.

    o	Each R session uses a per-session temporary directory which
	is removed at normal termination.  The directory name is given
	by the tempdir() function, and filenames returned by
	tempfile() will be within that directory.

    o	help.start() on Unix now uses a .R subdirectory of the
	per-session temporary directory and not ~/.R.  A side effect
	is that ~/.R is now never deleted by R.

	This now uses the remote control mechanism only if the X
	display is local to the R process (as otherwise it might use a
	browser running on an arbitrary machine).

    o	*Very* experimental browseEnv() for browsing objects in an
	environment.

    o	cbind/rbind() used to ignore all zero-length vectors, an
	undocumented quirk for S-compatibility.	 This caused problems
	when combining zero-extent matrices and zero-length vectors, and
	now zero-length vectors are ignored unless the result would
	have zero rows/columns.

    o	read.table(stdin()) will now work.

    o	plot.spec(x) now also works for other x than AR and Pgram results.

    o	New functions La.chol() and La.chol2inv() for Cholesky
	decomposition and inverse of positive definite matrices using
	Lapack.

    o	Changes to the tcltk package

	- on Unix systems, the Tcl event loop has been integrated with
	  R's own (so that tkwait.variable() no longer halts updates of
	  plot windows).

	- also on Unix, stubs have been created to divert R's input
	  and output routines to go via Tcl commands. (Nothing
	  uses this at present, but packages might be developed to
	  take advantage of it.)

	- return value from Tcl commands is no longer invisible. A new
	  print method, print.tclObj(), has been introduced.

	- Tcl variables created by tclVar() are now explicitly put into
	  Tcl's global namespace, removing potential scoping problems.

	- The tcltk dynamic library now loads with local=FALSE since
	  the default had trouble when loading Tcl extensions
	  (e.g. Tix)

	- The tkpager() function had not been updated for the return
	  value change from 1.5.0

    o	The bmp(), jpeg() and png() devices can produce multiple
	bitmap files, one for each page.  The default filenames have been
	changed to include a sequence number.

    o	New function axTicks() returning tick mark locations like axis().

    o	grid() has a more sensible default behavior.  Tick axis alignment
	only happens when no numbers of grid cells are specified.  New
	arguments lwd and equilogs; nx/ny = NA for not drawing, see ?grid.

    o	installed.packages() has a new argument `priority'.

    o	termplot() uses factor levels rather than 1,2,3... for x-axis.

    o	Workaround for optimization bugs on gcc 3.1/2 on 32-bit Solaris.

    o	The trace() function has been robustified and a new function
	tracingState() added to turn tracing temporarily on and off.

    o	New cophenetic() in "mva" as utility for hierarchical clustering.

    o	p.adjust() has two new methods, 'Hommel' and 'FDR', contributed
	by Gordon Smyth <smyth@wehi.edu.au>.

    o	stars() now has add and plot arguments.


DEPRECATED & DEFUNCT

    o	The assignment operator `_' is deprecated: a warning is	given
	once per R session.

    o	machine() is deprecated in favour of .Platform$OS.type.
	Machine() and Platform() are deprecated in favour of .Machine
	and .Platform.

    o	arima0.diag() (package ts) is defunct.

    o	piechart() is defunct.

    o	print.ordered() has been removed, so print.factor() is used.

    o	The global internal variables .Dyn.libs and .lib.loc are
	removed in favor of the internal functions .dynLibs() and
	.libPaths().

    o	restart() is deprecated in preparation for proper exception
	handling.  Use try(), as has long been recommended.


DOCUMENTATION CHANGES

    o	New demo(persp) containing some of the former example(persp) ones
	and more.


C-LEVEL FACILITIES

    o	Rversion.h is no longer automatically included by R.h.
	Include it explicitly if you need it.

    o	New entry point R_tmpnam in Utils.h.

    o	The Unix event loop interface has been changed to facilitate
	integration with other loops. R_checkActivity and
	R_runHandlers should eventually replace getSelectedHandler.


INSTALLATION CHANGES

    o	Perl 5.005 or newer is now required.

    o	R CMD INSTALL is now guaranteed to sort the R source files in
	ASCII order.


UTILITIES

    o	R CMD check now tests for mis-use on an installed or binary
	package, and sets 'T' and 'F' to 'NULL' when running the
	examples.

    o	New function SweaveSyntConv() converts between Sweave file
	syntaxes. RweaveLatex() now gets its prompt from options() and
	uses the text width as linebreak cutoff for deparsing input
	statements.


BUG FIXES

    o	axis() was not respecting par("mgp")[3] by default.
	(PR#916)

    o	tcltk back-compatibility fix for tcl8.0

    o	hist.POSIXct(*, breaks) now works for `breaks = #{breaks}' and
	when `x' has NAs; the latter applies to cut.POSIXct() as well.

    o	The internal download.file() methods were setting the proxy
	port to 0 unless it was specified.

    o	poly() did not work for >=3 column matrices.

    o	cut.default() was not handling infinite values with infinite
	breaks.	 (PR#1694)

    o	ks.test() could fail due to integer overflow if n.x and n.y
	were both large.

    o	all.equal(3., 3:3) wasn't TRUE when the methods package was
	present.

    o	read.table() could remap non-syntactic names to duplicates,
	and did not check for duplicated names.

    o	ls.str(envir = environment(F)) now works (when F is a function).

    o	pie() now has a `border' (and 'lty') argument which allows empty
	slice borders and makes pie() useable for hundreds of slices.

    o	all.equal.character() now works correctly also when NAs don't
	match (PR#1767).

    o	all.equal.numeric() now gives character {instead of list} when
	lengths don't match.

    o	read.dcf() had a memory leak.

    o	Setting "tcl = a" in a highlevel graphic function worked almost
	as if par(tcl = a) was called (i.e. was persistent).  Further,
	after par(tcl= <.>), highlevel graphic setting of tcl didn't work
	anymore.  "tck" has now S's default of -0.01 (when tcl=NA).

    o	data() was not checking if ./data was a directory before
	warning.

    o	Assignment beyond the end of character strings was filling
	with "", whereas changing the length extended with NA_STRING.
	Now NA_STRING is used for both.

    o	boxplot()s with logarithmic scale in "width-direction" now have
	proper widths, i.e. typically constant.

    o	Using GNU readline in asynchronous event callbacks (e.g. TclTk
	or Gtk) works correctly, i.e. doesn't cause readline to abort
	the process.

    o	Using Q to exit a browser invoked at the top-level could lead to
	the browser being invoked on all future top-level loops (PR#1721)

    o	step(fit, direction="both") now uses both directions even if
	no scope is supplied.

    o	strwidth(), strheight() now give 0 on NA strings (as they
	are no longer plotted). (PR#1739)

    o	mtext(), persp(), plot.hclust() and title() no longer plot NA
	character strings.

    o	pdf() has been protected against the user who specified
	non-existent fonts. (PR#1748)

    o	dlnorm() returns zero for negative x argument. (PR#1781)

    o	Printing 0 in octmode gave "" not "0". (PR#1759)

    o	anova.glm() was ignoring a `dispersion' argument if given
	multiple objects. (PR#1807)

    o	model.matrix() with a `rhs ~ .' formula included columns with
	duplicated names in the data frame, which caused subsequent
	confusion (e.g. in prediction from the object).

	model.matrix() was sometimes incorrectly determining the first
	factor in a formula without an intercept.

    o	termplot() now needs data= argument more rarely. (PR#828)

    o	abline() on log scale doesn't draw -ve points. (PR#1243)

    o	The Java search engine now works within Mozilla 1.0 and
	Netscape 6.2.x / 7.0pr1.

    o	unsplit() failed if f was a list of factors. (PR#1843)

    o	The methods package generic version of primitives is now "sealed"
	and cannot be redefined (it was always a bad idea to do so).

    o	quantile() gave -Inf not NaN in some examples. (Related to PR#1852)

    o	read.table() read too far in checking the file structure if
	0 < nrows < 5 and more rows existed on the file. (PR1809)

    o	loess() was not checking for too small a span (so no points
	were included in the smoothing window).

    o	match() was assuming that there was only one possible bit
	pattern for a numeric NA, so some matches failed on Solaris
	under some compiler options.

    o	identical() no longer thinks NaN and as.double(NA) are identical.

    o	pipe() can open in a binary mode even on Linux (where popen
	cannot).

    o	zero-column matrices were not being printed at all, not even
	the row names.

    o	polygon()'s `border' argument was incorrectly documented: in
	particular `border = 0' plots in background colour.

    o	delete.response() was losing the attribute set for safe
	prediction. (PR#1840)

    o	poly() was checking the degree against the number of points
	even when predicting.

    o	Comparison of a data frame and list failed due to typo. (PR#1889)

    o	dput() and dump() attempt to check if writing succeeded. (PR#1884)

    o	rep(1:2, 0) and hence array(1:2, 0) fail no longer.

    o	apply(matrix("", 3, 0), 2, length) now works.

    o	order(na.last = NA, decreasing = TRUE) now sorts in decreasing
	order.	(PR#1906)

    o	order(na.last=NA) failed if all args were of length 1 or all
	were NA. (PR#1913, 1981)

    o	source() would crash if the `keep.source = TRUE' and the input
	contained a function with a line longer than 1024 chars. (PR#1900)

	The limits on nesting of functions and on total function size
	when the source is kept are now enforced.  As (incorrectly)
	the source was always kept, this meant functions longer than
	128Kb could crash R, even in packages.

    o	lqs() and cov.rob() check that the quantile argument does not
	exceed n-1.

    o	grid() now also works with log coordinates active.

    o	plot.table(tab, xlab="X", ylab="Y") now works as expected.

    o	plot.formula(ask=FALSE) now works. (PR#1923)

    o	as.list(<logical>) now works properly. (PR#1926).

    o	The residual SSq printed from an aov() fit with weights is
	now the weighted SSq.  (PR#1930)

    o	aov() could still fail on multistrata models with very long
	Error formulae.

    o	try() could fail in BATCH use due to use of fflush(stdin).
	Only seen on Solaris. (PR#1934)

    o	title(main=list("main")) printed garbage, as did similar calls
	using quote() instead of expression() for plotmath. (PR#1939)

    o	deparse() dropped parentheses in some case where they were
	needed. (PR#1119, 1737, 1928, at least)

    o	pdf(onefile = FALSE) never incremented the file number beyond
	two.

    o	On Unix, protect against broken pipes where popen calls succeed
	even though the command does not exist (and the glibc manual
	says it should return NULL).  (PR#1959)

    o	data.frame() was allowing explicit row.names with missing
	values, but row names are required to be unique.

    o	as.character(expression) was silently truncating to 60
	characters: the help page claimed 500 which is now true.

    o	as.hclust(x) now also works (as identity) for "hclust" objects.

    o	NextMethod didn't work right in Ops.

    o	dotchart() now obeys `xlim ='.

    o	t(x) behaves when x is a (multivariate) time series. (PR#1998)

    o	parse(text=x) no longer parses from stdin if length(x) is zero

    o	binom.test() miscalculated p-value in some extreme cases

    o	get("print.ts")(1) would segfault. It's now just an error.

    o	cbind(NULL) {and similar} gave an error instead of NULL.

    o	the complex version of solve(a,b) now also works if b is a
	vector


		CHANGES IN R VERSION 1.5.1


NEW FEATURES

    o	Enhancements to mathematical annotation of plots:

	- expressions involving dot(<something>) now produce a dot accent
	  above the <something> (initial patch from Ben Bolker).

	- within an expression, the symbol partialdiff is now converted
	  to a partial differential symbol (greek delta).

    o	smooth.spline() has a new argument `nknots' allowing to set the
	default number of knots (when `all.knots = FALSE' as per default).


BUG FIXES

    o	Rdconv now skips CRs in input files, even on Unix.

    o	readBin() had a (very slow) memory leak if changing size or reading
	character strings.  writeChar() had a memory leak.

    o	polygon() and rect() with lty = "blank" were omitting the fill
	colour (if present).  symbols(circles=, lty="blank") was
	drawing the border of the disks.

    o	Subsetting non-existent rows in a data frame would produce
	missing row names, which are not allowed.

    o	On Unix, R_PAPERSIZE was set to '' instead of 'a4' as default on
	systems without paperconf.

    o	Under GNOME, capabilities() now reports correctly that X11, png
	and jpeg are available (if they are under X11).

    o	The names of some results of unlist() had the wrong internal
	length, which confused paste().	 Both have been corrected. (PR#1524)

    o	RweaveLatex.Rd had unbalanced braces in section "Supported
	Options".

    o	merge() with multiple and differently-named match columns
	failed. (PR#1510)

    o	NAs in right-justified unquoted character matrices were being
	mis-aligned.  This mainly affected printing data frames.

    o	predict.*bSpline() bugs extrapolating for deriv >= 1 (PR#1473),
	and predict.[bn]s bug e.g. for bs(x), reported by Ch.Sangiorgio.

    o	qr.X was failing if n < p.  Fixed, but only in the case when
	pivoting does not occur. (PR#1519)

    o	xx[, 1:3] was returning a list if xx had only one row, even
	though xx[1, 1:3] was a data frame. (PR#1530)

    o	nls() was reporting incorrectly the number of iterations if the
	maximum was reached.

    o	rbind.data.frame() was coercing logical columns to factors.
	(PR#1536)

    o	Rprof(NULL) or Rprof("") called when not profiling caused a
	segfault: now silently ignored.	 (PR#1471)

    o	On systems (e.g. Windows) using R's own code for expm1, the
	values were wrong for large negative x, and this affected
	pweibull(), for example.

    o	prettyNum(*, bigmark=*) added extra marks in some cases. (PR#1548)

    o	cut.dendrogram() failed in some cases. (PR#1552)

    o	The links in refman.pdf were broken by a single invalid
	\alias{}. Now Rdconv checks more comprehensively. (PR#1550)

    o	predict(smooth.spline(x,*), deriv =1) did not predict at all `x'
	values, and
	smooth.spline(x,*, all.knots = TRUE) used much too much memory
	when length(x) was largish.
	smooth.spline(*, .... trace = TRUE ..) is a bit more self-explaining.

    o	pexp(x, log=TRUE) and pweibull(*) were losing precision for large x.

    o	Workaround for NetBSD bug in compiling dounzip.c. (PR#1565/6)

    o	Conversions to numeric in type.convert were always treating "NA" as
	missing whatever the setting of na.strings. (PR#1568)

    o	R CMD check now deals correctly with package names containing a
	'.' in the Depends field of a DESCRIPTION file. (PR#1591)

    o	pbinom() and pbinom() were misssing the "fuzz" that other discrete
	distributions have in order to guard against truncation.

    o	The "=" assignment operator behaved as "<<-" in some constructions
	with composite left-hand sides.

    o	Added print.AsIs() method to ensure "AsIs" objects are printed
	by the method for their real class. (PR#1587)

    o	mosaicplot(*, color = v) now recycles v[] if needed.

    o	Calling dev.control("inhibit") with no graphics device open
	crashed R. (PR#1605)

    o	read.dcf() was not checking that memory allocation succeeded.

    o	The C function fprec might overflow for > 16 digits, showing
	up in example(str) on some platforms.

    o	Changes to the methods package:

	- Nonstandard generic function definitions given to
	  setGeneric now work; these were previously ignored.

	- Classes that extend matrix, etc. as the data part previously lost
	  their attributes.

	- There were bugs in distinguishing methods for "missing" from
	  methods for "ANY".

	- Some coerce methods were not selected correctly when the two classes
	  were related by an "is" relation.

	- extends() now works correctly if given a class definition rather
	  than a name.

	- class()<- was leaving in an explicit class attribute for basic data
	  types.

	- Method signatures including arguments following "..." in the
	  argument list of the generic didn't work.

    o	par(mgp = v) now allows negative `v' (S-compatibly and sensibly).

    o	identify.hclust() masked its `x' argument and so failed.

    o	System rint was never being used in fround.c.

    o	round/trunc.POSIXt were erroneously retaining information on
	DST. (PR#1543)

    o	tcltk package didn't work with tcl8.0.x.  Compatibility code
	inserted (PR#1640, thanks to Rene' Bertin for helping out with
	this).

    o	selfStart() {pkg "nls"} now works again when parameter names are
	not specified (but implicit).

    o	legend() now treats lty="0" properly (as solid).

    o	ARMAacf was failing if 0 < p < q+1: it failed to say that ar needed
	to be padded with zeroes, and now the code does that.

    o	old.packages() was assuming a bundle was installed in only one
	library, and so update.packages() would only update a bundle
	in the first location in lib.loc.

    o	fisher.test() could miscalculate odds ratio and confidence
	interval for tables with large entries, due to numerical
	overflow.

    o	Using lty = "1" (or "10") does no longer produce invalid
	postscript or pdf.  Using "0" in a character lty is currently not
	implemented device-independently and needs more fixing.

    o	ccf(plot = FALSE) was returning a spurious extra 0 at lag 0.

    o	On console-based versions of R (Windows, GNOME, probably
	Mac OS) warning/error messages longer than 8192 chars could
	crash R. (PR#1651)

    o	Comparisons between objects of mode "call" using "==" now return
	TRUE if both sides deparse to the same string (as always intended).

    o	HoltWinters() now initializes correctly in the exponential
	smoothing case, and plot.HoltWinters() allows lty to be set.

    o	fisher.test() crashed due to corruption on some large
	problems.  It also crashed on tables with total one. (PR#1662)

    o	The substitution code for strptime (used e.g. on Windows)
	cached the month names and so did not recognise locale changes
	during an R session, as used by get.hist.quote{tseries}.
	Caching has been supressed.  (PR#1116)

    o	Some functions used the non-existing error() function instead
	of stop().

    o	vector("complex",n)  doesn't return random garbage anymore.


		CHANGES IN R VERSION 1.5.0


USER-VISIBLE CHANGES

    o	XDR support is now guaranteed to be available, so the default
	save format will always be XDR binary files, and it is safe to
	distribute data in that format.	 (We are unaware of any
	platform that did not support XDR in recent versions of R.)

	gzfile() is guaranteed to be available, so the preferred
	method to distribute sizeable data objects is now via
	save(compress = TRUE).

    o	pie() replaces piechart() and defaults to using pastel colours.

    o	formatC has new arguments (see below) and formatC(*, d = <dig>)
	is no longer valid and must be written as formatC(*, digits = <dig>).

    o	Missingness of character strings is treated much more
	consistently, and the character string "NA" can be used as a
	non-missing value.

    o	summary.factor() now uses a stable sort, so the output will
	change where there are ties in the frequencies.


NEW FEATURES

    o	Changes in handling missing character strings:

	-  "NA" is no longer automatically coerced to a missing value
	   for a character string.  Use as.character(NA) where a missing
	   value is required, and test via is.na(x) not x == "NA".
	   String "NA" is still converted to missing by scan() and
	   read.table() unless `na.strings' is changed from the default.

	-  A missing character string is now printed as `NA' (no quotes)
	   amongst quoted character strings, and `<NA>' if amongst
	   unquoted character strings.

	-  axis() and text.default() omit missing values of their
	   `labels' argument (rather than plotting "NA").

	-  Missing character strings are treated as missing much more
	   consistently, e.g. in logical comparisons and in sorts.
	   identical() now differentiates "NA" from the missing string.


    o	Changes in package methods:

	-  New function validSlotNames().

	-  Classes can explicitly have a "data part", formally
	   represented as a .Data slot in the class definition, but
	   implemented consistently with informal structures.  While the
	   implementation is different, the user-level behavior largely
	   follows the discussion in "Programming with Data".

       -   A "next method" facility has been provided, via the function
	   callNextMethod().  This calls the method that would have been
	   selected if the currently active method didn't exist.  See
	   ?callNextMethod().  This is an extension to the API.

       -   Classes can have initialize methods, which will be called
	   when the function new() is used to create an object from the
	   class.  See ?initialize.  This is an extension to the API.

       -   The logic of setGeneric() has been clarified, simplifying
	   nonstandard generic functions and default methods.


    o	Changes in package tcltk:

	-  Now works with the GNOME user interface.

	-  Several new functions allow access to C level Tcl objects.
	   These are implemented using a new `tclObj' class, and this
	   is now the class of the return value from .Tcl() and tkcmd().


    o	Changes in package ts:

	-  More emphasis on handling time series with missing values
	   where possible, for example in acf() and in the
	   ARIMA-fitting functions.

	-  New function arima() which will replace arima0() in due
	   course.  Meanwhile, arima0() has been enhanced in several
	   ways.  Missing values are accepted.	Parameter values can
	   be initialized and can held fixed during fitting.  There is
	   a new argument `method' giving the option to use
	   conditional-sum-of-squares estimation.

	-  New function arima.sim().

	-  New datasets AirPassengers, Nile, UKgas and WWWusage,
	   and a expanded version of UKDriverDeaths (as a multiple
	   time series Seatbelts).

	-  New generic function tsdiag() and methods for arima and arima0,
	   to produce diagnostic plots.	 Supersedes arima0.diag().

	-  New functions ARMAacf() and ARMAtoMA() to compute
	   theoretical quantities for an ARMA process.

	-  New function acf2AR() to compute the AR process with a given
	   autocorrelation function.

	-  New function StructTS() to fit structural time series, and
	   new generic function tsSmooth() for fixed-interval
	   state-space smoothing of such models.

	-  New function monthplot() (contributed by Duncan Murdoch).

	-  New functions decompose() and HoltWinters() (contributed by
	   David Meyer) for classical seasonal decomposition and
	   exponentially-weighted forecasting.


    o	An extensible approach to safe prediction for models with e.g.
	poly(), bs() or ns() terms, using the new generic function
	makepredictcall().  Used by most model-fitting functions
	including lm() and glm().  See ?poly, ?cars and ?ns for
	examples.

    o	acosh(), asinh(), atanh() are guaranteed to be available.

    o	axis() now omits labels which are NA (but still draws the
	tick mark.

    o	Connections to bzip2-ed files via bzfile().

    o	chol() allows pivoting via new argument `pivot'.

    o	cmdscale() now takes rownames from a dist object `d' as well
	as from a matrix; it has new arguments `add' (as S) and `x.ret'.

    o	crossprod() handles the case of real matrices with y = x
	separately (by accepting y = NULL).  This gives a small
	performance gain (suggestion of Jonathan Rougier).

    o	deriv/deriv3() can now handle expressions involving pnorm and
	dnorm (with a single argument), as in S-PLUS.

    o	New function expm1() both in R and in C API, for accurate exp(x)-1;
	precision improvement in pexp() and pweibull() in some cases.
	(PR#1334-5)

    o	New function findInterval() {using new C entry point
	findInterval, see below}.

    o	formatDL() now also works if both items and descriptions are
	given in a suitable list or matrix.

    o	gzfile() is guaranteed to be available, and hence the
	`compress' option to save() and save.image().

    o	hist() now has a method for date-time objects.

    o	library() now checks the dependence on R version (if any) and
	warns if the package was built under a later version of R.

    o	library(help = PKG) now also returns the information about the
	package PKG.

    o	Added function logb(), same as log() but for S-PLUS
	compatibility (where log now has only one argument).

    o	New na.action function na.pass() passes through NAs unaltered.

    o	piechart() has been renamed to pie(), as piechart is a Trellis
	function for arrays of pie charts.  The default fill colours
	are now a set of pastel shades, rather than par("bg").

    o	plclust() in package mva, for more S-PLUS compatibility.

    o	poly() now works with more than one vector or a matrix as input,
	and has a predict method for objects created from a single
	vector.

    o	polyroot() now handles coefficient vectors with terminal
	zeroes (as in S).

    o	New prettyNum() function used in formatC() and format.default()
	which have new optional arguments `big.mark', `big.interval',
	`small.mark', `small.interval', and `decimal.mark'.

    o	print.coefmat() has a new argument 'eps.Pvalue' for determining
	when small P-values should be printed as  "< {...}".

    o	The recover() function has been moved to the base package.
	This is an interactive debugging function, usually a good
	choice for options(error=).  See ?recover.

    o	rep() has a new argument `each' for S-PLUS compatibility.
	The internal call is made available as rep.int(), again for
	help in porting code.

    o	New functions rowSums(), colSums(), rowMeans() and colMeans():
	versions of apply() optimized for these cases.

    o	rug() now has a "..." argument allowing its location to be specified.

    o	scan() can have NULL elements in `what', useful to save space
	when columns need to be discarded.

    o	New option by = "DSTday" for seq.POSIXt().

    o	Changes to sorting:

	-  sort(), sort.list() and order() have a new argument
	   `decreasing' to allow the order to be reversed whilst
	   still preserving ties.

	-  sort() has an option to use quicksort in some cases
	   (currently numeric vectors and increasing order).

	-  The default Shell sort is Sedgewick's variant, around 20%
	   faster, and pre-screening for NAs speeds cases without any
	   NAs several-fold.

	-  sort.list() (and order with just one vector) is several
	   times faster for numeric, integer and logical vectors, and
	   faster for character vectors.

    o	New assignment forms of split(); new function unsplit().

    o	New sprintf() function for general C like formatting, from
	Jonathan Rougier.

    o	Argument `split' of summary.{aov,aovlist} is now implemented.

    o	summary.princomp() now has a separate print() method, and
	`digits' is now an argument to the print method and not to
	summary.princomp itself.

    o	An extended version of the trace() function is available,
	compatible with the function in S-PLUS.	 Calls to R functions
	can be inserted on entry, on exit, and before any
	subexpressions. Calls to browser() and recover() are useful.
	See ?trace.

    o	New function TukeyHSD() for multiple comparisons in the results
	of aov().  (Formerly function Tukey in package Devore5 by
	Douglas Bates.)

    o	New read-only connections to files in zip files via unz().

    o	warning() has new argument `call.', like stop()'s.

    o	zip.file.extract() is no longer provisional and has an
	"internal" method available on all platforms.

    o	Methods for [, [<- and as.data.frame() for class "POSIXlt".

    o	Much improved printing of matrices and arrays of type "list".

    o	The "Knuth-TAOCP" option for random-number generation has been
	given an option of using the 2002 revision.  See ?RNG for the
	details: the R usage already protected against the
	reported `weakness'.

    o	min/max of integer(0) (or NULL) is now Inf/-Inf, not an
	extreme integer.


DEPRECATED & DEFUNCT

    o	.Alias, reshapeLong(), reshapeWide() are defunct.

    o	arima0.diag() (package ts) is deprecated: use tsdiag() instead.

    o	piechart() is deprecated; renamed to pie().


DOCUMENTATION CHANGES

    o	`Writing R Extensions' now has an example of calling R's
	random numbers from FORTRAN via C.

    o	R itself and all R manuals now have ISBN numbers, please use
	them when citing R or one of the manuals.


INSTALLATION CHANGES

    o	The configure script used when building R from source under Unix
	is now generated using Autoconf 2.50 or later, which has the
	following 'visible' consequences:

	- By default, configure no longer uses a cache file.  Use the
	  command line option '--config-cache' (or '-C') to enable
	  caching.

	- Key configuration variables such as 'CC' are now *precious*,
	  implying that the variables

	  * no longer need to be exported to the environment and can and
	    should be set as command line arguments;

	  * are kept in the cache even if not specified on the command
	    line, and checked for consistency between two configure runs
	    (provided that caching is used, see above);

	  * are kept during automatic reconfiguration as if having been
	    passed as command line arguments, even if no cache is used.

	  See the variable output section of 'configure --help' for a
	  list of all these variables.

    o	Configure variable 'FC' is deprecated, and options '--with-g77',
	'--with-f77' and '--with-f2c' are defunct.  Use configure
	variable 'F77' to specify the FORTRAN 77 compiler, and 'F2C' to
	specify the FORTRAN-to-C compiler and/or that it should be used
	even if a FORTRAN 77 compiler is available.

    o	Non-standard directories containing libraries are specified
	using configure variable 'LDFLAGS' (not 'LIBS').


UTILITIES

    o	Sweave(), Stangle() and friends in package tools.  Sweave allows
	mixing LaTeX documentation and R code in a single source file:
	the R code can be replaced by its output (text, figures) to
	allow automatic report generation.  Sweave files found in
	package subdir 'inst/doc' are automatically tested by R CMD
	check and converted to PDF by R CMD build, see the section on
	package vignettes in the 'Writing R Extensions' manual.

    o	Rdconv can convert to the S4 '.sgml' format.

    o	R::Utils.pm masks some platform dependencies in perl code by
	providing global variables like R_OSTYPE or wrapper functions
	like R_runR().

    o	If a directory 'inst/doc' is present in the sources of a
	package, the HTML index of the installed package has a link to
	the respective subdirectory.

    o	R CMD check is more stringent: it now also fails on malformed
	'Depends' and 'Maintainer' fields in 'DESCRIPTION' files, and on
	unbalanced braces in Rd files.	It now also provides pointers to
	documentation for problems it reports.

    o	R CMD check, build and INSTALL produce outline-type output.

    o	QC functions in package 'tools' now return the results of their
	computations as objects with suitable print() methods.	By
	default, output	is only produced if a problem was found.

    o	New utility R CMD config to get the values of basic R configure
	variables, or the header and library flags necessary for linking
	against R.

    o	Rdindex and maketitle.pl require perl 5.005, as Text::Wrap::fill
	was only introduced at 5.004_05.


C-LEVEL FACILITIES

    o	All the double-precision BLAS routines are now available,
	and package writers are encouraged not to include their own
	(so enhanced ones will be used if requested at configuration).

    o	findInterval(xt[],n,x,...) gives the index (or interval number)
	of x in the sorted sequence xt[].  There's an
	F77_SUB(interv)(.) to be called from Fortran; this used to be
	part of predict.smooth.spline's underlying Fortran code.

    o	Substitutes for (v)snprintf will be used if the OS does not
	supply one, so tests for HAVE_(V)SNPRINTF are no longer needed.

    o	The DUP and NAOK arguments in a .C() call are not passed on
	to the native routine being invoked.  Any code that relied on
	the old behaviour will need to be modified.

    o	log1p is only provided in Rmath.h if it is not provided by the
	platform, in which case its name is not remapped, but a
	back-compatibility entry point Rf_log1p is provided.
	Applications using libRmath may need to be re-compiled.

    o	The methods used by optim() and integrate() have entry points in
	R_ext/Applic.h and have a more general interface documented in
	`Writing R Extensions'.

    o	The bessel_? entry points are now suitable to be called
	repeatedly from code loaded by .C().  (They did not free
	memory until .C() returned in earlier versions of R.)

    o	Server sockets on non-Windows platforms now set the SO_REUSEADDR
	socket option.	This allows a server to create simultanous
	connections to several clients.

    o	New quicksort sorting (for numeric no-NA data), accessible from
	C as R_qsort() etc and from Fortran as qsort4() and qsort3().

    o	Rinternals.h no longer includes fcntl.h, as this is not an
	ISO C header and cannot be guaranteed to exist.

    o	Fortran subroutines are more correctly declared as `extern void'
	in R_exts/Applic.h and R_exts/Linpack.h.


BUG FIXES

    o	The calculation of which axes to label on a persp() plot was
	incorrect in some cases.

    o	Insufficient information was being recorded in the display list
	for the identify() function.  In particular, the "plot="
	argument was ignored when replaying the display list. (PR#1157)

    o	The vertical alignment of mathematical annotations was wrong.
	When a vertical adjustment was not given, it was bottom-adjusting
	i.e,. it was treating adj=0 as adj=c(0, 0).  It now treats
	adj=0 as adj=c(0, 0.5) as for "normal" text. (PR#1302)

    o	the man page (doc/R.1) wasn't updated with the proper VERSION.

    o	smooth.spline() had a "df = 5" default which was never used and
	hence extraneous and misleading.

    o	read.fwf() was interpreting comment chars in its call to scan:
	replaced by a call to readlines(). (PR#1297/8)

    o	The default has been changed to scan(comment.char="") for
	consistency with earlier code (as in the previous item).

    o	bxp(*, notch.frac = f) now draws the median line correctly.

    o	Current versions of gs were rotating the output of
	bitmap(type = "pdfwrite") and when converting the output
	of postscript() to PDF; this has been circumvented by
	suppressing the %%Orientation comment for non-standard
	paper sizes.

    o	plot.ts(x, log = "y") works again when x has 0s, also for matrix x.

    o	add1(), drop1(), step() work again on glm objects with
	formulae with rhs's containing `.'.  (Broken by a `bug fix'
	(in reality an API change) in 1.2.1.)

    o	optim(method="BFGS") was not reporting reaching `maxit'
	iterations in the convergence component of the return value.

    o	aov() and model.tables() were failing on multistrata models with
	excessively long Error formula. (PR#1315)

    o	Transparent backgrounds on png() devices on Unix-alikes had
	been broken during the driver changes just prior to 1.4.0.
	(They worked correctly on Windows.)

    o	demo(is.things) didn't work properly when the methods package was
	attached.

    o	match(), unique() and duplicated() were not declaring all NaNs to be
	equal, yet not always distinguishing NA and NaN.  This was
	very rare except for data imported as binary numbers.

    o	The error handler recover() protects itself against errors in
	dump.frames and uses a new utility, limitedLabels, to generate
	names for the dump that don't inadvertently blow the limit on
	symbol length.	(TODO:	either fix dump.frames accordingly or
	remove the limit--say by truncating very long symbols?)

    o	se.contrasts() works more reliably with multistratum models,
	and its help page has an example.

    o	summary.lm() was not returning r.squared nor adj.r.squared for
	intercept-only models, but summary.lm.null() was returning
	r.squared but not adj.r.squared.  Now both are always
	returned.  Neither returned f.statistic, and that is now
	documented.

    o	Subsetting of matrices of mode list (or other non-atomic
	modes) was not implemented and gave incorrect results without
	warning. (PR#1329)
	Under some circumstances subsetting of a character matrix
	inserted NA in the wrong place.

    o	abs() was not being treated as member of the Math group
	generic function, so e.g. its method for data frames was not
	being used.

    o	set.seed(seed, "default") was not using the `seed' value (only
	for kind = "default").

    o	logLik.lm() now uses  "df = p + 1" again (`+ sigma'!).

    o	logLik.glm() was incorrect for families with estimated dispersion.

    o	Added strptime() workaround for those platforms (such as
	Solaris) that returned missing components as 0.	 Missing
	days are now detected, but missing years will still
	be interpreted as 1900 on such platforms.

    o	Inheritance in formal classes (the methods package) works
	breadth-first as intuition would expect.

    o	The new() function in package `methods' works better (maybe even
	correctly?) for the various combinations of super-classes and
	prototypes that can be supplied as unnamed arguments.

    o	Internal code allowed one more connection to be allocated than
	the table size, leading to segfaults. (PR#1333)

    o	If a user asks to open a connection when it is created and
	it cannot be opened, the connection is destroyed before returning
	from the creation call.	 (related to PR#1333)

    o	Sys.putenv() was not using permanent storage. (PR#1371)

    o	La.svd() was not coercing integer matrices. (PR#1363)

    o	deriv(3) now reports correctly the function it cannot find
	the derivatives table.

    o	The GNOME user interface was over-enthusiastic about setting
	locale information.  Now only LC_CTYPE, LC_COLLATE and LC_TIME
	are determined by the user's environment variables (PR#1321)

    o	In X11, locator() would sound the bell even if "xset b off"
	had been set.

    o	merge() could be confused by inconsistent use of as.character()
	giving leading spaces.

    o	[pqr]binom() no longer silently round the `size' argument,
	but return NaN (as dbinom() does). (PR#1377)

    o	Fixed socket writing code to block until all data is written.
	Fixed socket reading code to properly handle long reads and reads
	with part of the data in the connection buffer.

    o	Allow sockets to be opened in binary mode with both open="ab" and
	open="a+b".

    o	levels<-.factor() was using incorrectly list values longer than
	the number of levels (PR#1394), and incorrectly documented
	that a character value could not be longer than the existing
	levels.

    o	The pdf() device was running out of objects before the
	documented 500 page limit.  Now there is no limit.

    o	legend() did not deal correctly with `angle' arguments. (PR#1404)

    o	sum() tried to give an integer result for integer arguments,
	but (PR#1408)
	- this was not documented
	- it sometimes warned on overflow, sometimes not
	- it was order-dependent for a mixture of integer and numeric args.

    o	mean() gave (numeric) NA if integer overflow occurred in sum(),
	but now always works internally with numeric (or complex) numbers.

    o	sort.list() and order() were treating NA_STRING as "NA".

    o	sort.list(na.last = NA) was not implemented.

    o	seq.default() was returning only one element for a relative
	range of less than about 1e-8, which was excessively conservative.
	(PR#1416)

    o	tsp(x) <- NULL	now also works after library(methods).

    o	persp(shade=) was not working correctly with the default
	col=NULL if this was transparent. (PR#1419)

    o	min/max(complex(0)) was returning a random value.

    o	range() gave c(1, 1).

    o	range(numeric(0)) is now c(Inf, -Inf), as it was documented to be.

    o	print.ts() was occasionally making rounding errors in the labels
	for multiple calendar time series.

    o	Rdconv was not handling nested \describe{} constructs when
	converting to HTML (PR#1257) and not fixing up mal-formed
	\item fields in \describe{} when converting to text (PR#1330).

    o	filled.contour() was not checking consistency of x, y, z.
	(PR#1432)

    o	persp.default() no longer crashes with non-character labels.
	(PR#1431)

    o	fft() gave incorrect answers for input sizes 392, 588, 968, 980 ....
	(PR#1429)

    o	det(method = "qr") gave incorrect results for numerically
	singular matrices. (PR#1244)

    o	barplot() now allows the user to control `xpd'. (PR#1088, 1398)

    o	library() (with no arguments) no longer fails on empty TITLE files.

    o	glm() was failing if both offset() and start were specified. (PR#1421)

    o	glm() might have gotten confused if both step-shortening and
	pivoting had occurred (PR#1331).  Step-halving to avoid the
	boundary of feasible values was not working.

    o	Internal representation of logical values was not being
	treated consistently. (Related to PR#1439)

    o	The c() function sometimes inserted garbage in the name vector
	for some types of objects, e.g.	 names(c(ls, a=1)).

    o	Fixed bug in `$' that could cause mutations on assignment (PR#1450).

    o	Some X servers displayed random bytes in the window title of
	graphics windows (PR#1451)

    o	The X11 data editor would segfault if closed with window manager
	controls (PR#1453)

    o	Interrupt of Sys.sleep() on UNIX no longer causes subsequent
	Sys.sleep() calls to segfault due to infinite recusion.

    o	Eliminated a race condition that could cause segfaults when a SIGINT
	was received while handling an earlier SIGINT.

    o	rect(lty = "blank") was incorrectly drawing with a dashed line.

    o	type.convert() was not reporting incorrectly formatted complex
	inputs. (PR#1477)

    o	readChar() was not resetting vmax, so causing memory build-up.
	(PR#1483)



	**************************************************
	*						 *
	*	       1.4 SERIES NEWS			 *
	*						 *
	**************************************************


		CHANGES IN R VERSION 1.4.1


BUG FIXES

    o	scan(multi.line = FALSE) now always gives an immediate error
	message if a line is incomplete. (As requested in PR#1210)

    o	read.table() is no longer very slow in processing comments:
	moved to C code and fewer lines checked.

    o	type.convert() could give stack imbalance warnings if used
	with as.is = TRUE.

    o	predict.mlm ignored newdata (PR#1226) and also offsets.

    o	demo(tkttest) was inadvertently changed in 1.4.0 so that it would
	evaluate the requested test, but not display the result.

    o	stars(scale = TRUE) (the default) now works as documented (and
	as S does).  Previously it only scaled the maximum to 1. (PR#1230)

    o	d0 <- data.frame(a = 0); data.matrix(d0[0, 0]) and
	data.matrix(d0[, 0]) now work.

    o	plot(multiple time series, plot.type = "single") was computing
	`ylim' from the first series only.

    o	plot.acf() has a new `xpd = par("xpd")' argument which by default
	*does* clipping (of the horizontal lines) as desired (xpd = NA was
	used before, erronously in most cases).

    o	predict(smooth.spline(.), deriv = 1) now works.

    o	identify() failed when x is a structure/matrix. (PR#1238)

    o	getMethod() returns NULL when optional=TRUE as promised in the
	documentation.

    o	setMethod() allows "..." to be one of the arguments omitted in
	the method definition (but so far no check for ... being missing)

    o	Allow round() to work again on very large numbers (introduced
	in fixing PR#1138). (PR#1254)

    o	Rinternals.h is now accepted by a C++ compiler.

    o	type.convert() was failing to detect integer overflow.

    o	piechart() was defaulting to foreground colour (black) fills
	rather than background (as used in 1.3.1 and earlier).	Now
	background is used, but be aware that as from 1.4.0 this may
	be transparent.

    o	La.eigen(*, only.values=TRUE) does not segfault anymore in one
	branch (PR#1262).

    o	cut() now produces correct default labels even when
	include.lowest = TRUE (PR#1263).

    o	reformulate() works properly with a response.

    o	cmdscale(*, k = 1) now works properly.

    o	Options by = "month" and "year" to seq.POSIXt() will always
	take account of changes to/from daylight savings time: this
	was not working on some platforms.

    o	glm.fit.null() now accepts all the arguments of glm.fit() (it
	could be called from glm.fit with arguments it did not
	accept), and is now documented.

    o	cov.wt(cbind(1), cor = TRUE) now works.

    o	predict(glm.object, se.fit = TRUE) was failing if the fit
	involved an offset.

    o	detach() on package:base would crash R. (PR#1271)

    o	print or summary on a manova() object with no terms, no names on
	the response and intercept = FALSE (which is not sensible)
	would give an error.

    o	seek() on file connections was ignoring the `origin' argument.

    o	Fixed new environment handling in library() to avoid forcing
	promises created by delay()

    o	arima0() could leak memory: now released via on.exit().

    o	qr.coef(qr,*) now keeps the names of qr$qr.

    o	read.00Index() no longer fails on data indexes not generated by
	Rdindex (PR#1274).


		CHANGES IN R VERSION 1.4.0


USER-VISIBLE CHANGES

    [This is a new section to highlight changes in behaviour, which
    may be given in more detail in the following sections.
    Many bug fixes are also user-visible changes.]

    o	The default save format has been changed, so saved workspaces
	and objects cannot (by default) be read in earlier versions of R.

    o	The number of bins selected by default in a histogram uses
	the correct version of Sturges' formula and will usually be
	one larger.

    o	data.frame() no longer converts logical arguments to factors
	(following S4 rather than S3).

    o	read.table() has new arguments `nrows' and `colClasses'.  If the
	latter is NA (the default), conversion is attempted to
	logical, integer, numeric or complex, not just to numeric.

    o	model.matrix() treats logical variables as a factors with
	levels c(FALSE, TRUE) (rather than 0-1 valued numerical
	variables).  This makes R compatible with all S versions.

    o	Transparency is now supported on most graphics devices.
	This means that using par("bg"), for example in legend(), will
	by default give a transparent rather than opaque background.

    o	[dpqr]gamma now has third argument `rate' for S-compatibility
	(and for compatibility with exponentials).  Calls which use
	positional matching may need to be altered.

    o	The meaning of spar = 0 in smooth.spline() has changed.

    o	substring() and substring()<- do nothing silently on a
	character vector of length 0, rather than generating an
	error.	This is consistent with other functions and with S.

    o	For compatibility with S4, any arithmetic operation using a
	zero-length vector has a zero-length result.  (This was
	already true for logical operations, which were compatible
	with S4 rather than S3.)

    o	undoc() and codoc() have been moved to the new package `tools'.

    o	The name of the site profile now defaults to
	`R_HOME/etc/Rprofile.site'.

    o	The startup process for setting environment variables now first
	searches for a site environment file (given by the environment
	variable `R_ENVIRON' if set or `R_HOME/etc/Renviron.site' if
	not), *and* then for a user `.Renviron' file in the current or
	the user's home directory.

    o	Former stars(*, colors = v) must now be stars(*, col.segments = v).

    o	The default methods for La.svd and La.eigen have changed and
	so there may be sign changes in singular/eigen vectors,
	including in cancor, cmdscale, factanal, princomp and varimax.


NEW FEATURES

    o	Transparency is now supported on most graphics devices.
	Internally colors include an alpha channel for opacity, but at
	present there is only visible support for transparent/opaque.
	The new color "transparent" (or NA or "NA") is transparent,
	and is the default background color for most devices.  Those
	devices (postscript, XFig, PDF, Windows metafile and printer)
	that previously treated bg = "white" as transparent now have
	"transparent" as the default and will actually print "white".
	(NB: you may have bg = "white" saved in .Postscript.options in
	your workspace.)

    o	A package `methods' has been added, containing formal classes
	and methods ("S4" methods), implementing the description in
	the book "Programming with Data".  See "?Methods" and the
	references there for more information.

	- In support of this, the "@" operator has been added to the
	  grammar.

	- Method dispatch for formal methods (the standardGeneric
	  function), is now a primitive. Aside from efficiency issues,
	  this allows S3-style generics to also have formal methods
	  (not really recommended in the long run, but it should at
	  least work).	The C-level dispatch is now implemented for
	  primitives that use either DispatchGroup or DispatchOrEval
	  internally.

	- A version of the function "plot" in the methods package has
	  arguments "x" and "y", to allow methods for either or both.
	  See "?setMethod" for examples of such methods.

	- The methods package now uses C-level code (from within
	  DispatchOrEval) to dispatch any methods defined for
	  primitive functions.	As with S3-style methods, methods can
	  only be defined if the first argument satisfies is.object(x)
	  (not strictly required for formal methods, but imposed for
	  now for simplicity and efficiency).

    o	Changes to the tcltk package:

	- New interface for accessing Tcl variables, effectively
	  making the R representations lexically scoped. The old form
	  is being deprecated.

	- Callbacks can now be expressions, with slightly unorthodox
	  semantics. In particular this allows bindings to contain
	  "break" expressions (this is necessary to bind code to
	  e.g. Alt-x without having the key combination also insert an
	  "x" in a text widget.)

	- A bunch of file handling and dialog functions (previously
	  only available via tkcmd) have been added

    o	The "?" operator is now an actual function.  It can be used
	(as always) as a unary operator (?plot) and the grammar now
	allows it as a binary operator, planned to allow
	differentiating documentation on the same name but different
	type (class?matrix, for example).  So far, no such
	documentation exists.

    o	New methods AIC.default() and logLik.glm(), also fixing
	AIC(<glm obj>).

    o	axis.POSIXct() allows the label date/times to be specified
	via the new `at' argument.

    o	arrows() now allows length = 0 (and draws no arrowheads).

    o	Modifications to the access functions for more consistency with S:
	arguments `name', `pos' and `where' are more flexible in
	assign(), exists(), get(), ls(), objects(), remove() and rm().

    o	Three new primitive functions have been added to base:
	dataClass(), objWithClass(), and as.environment().  The first two
	are support routines for class() and class<-() in package
	methods.  The third replaces pos.to.env() in the functions get(),
	exists(), and friends.

    o	barplot() now respects an inline `cex.axis' argument and has a
	separate `cex.names' argument so names and the numeric axis
	labels can be scaled separately.  Also, graphics parameters
	intended for axis() such as `las' can now be used.

    o	Shading by lines added to functions barplot(), hist(),
	legend(), piechart(), polygon() and rect().

    o	bxp() has a show.names argument allowing labels on a single
	boxplot; it and hence boxplot() now makes use of pch, cex, and bg
	for outlier points().

	bxp() and boxplot() also have an argument `outline' to suppress
	outlier drawing {S-PLUS compatibly}.

    o	New capabilities() options "GNOME" and "IEEE754".

    o	New function casefold(), a wrapper for tolower/toupper
	provided for compatibility with S-PLUS.

    o	contour() is now generic.

    o	cor.test() in package ctest now also gives an asymptotic
	confidence interval for the Pearson product moment correlation
	coefficient.

    o	data(), demo() and library() now also return the information
	about available data sets, demos or packages.  Similarly,
	help.search() returns its results.

    o	density() allows `bw' or `width' to specify a rule to choose the
	bandwidth, and rules "nrd0" (the previous default), "nrd",
	"ucv", "bcv", "SJ-ste" and "SJ-dpi" are supplied (based on
	functions in package MASS).

    o	df.residual() now has a default method, used for classes
	"lm" and "glm".

    o	New argument `cacheOK' to download.file() to request cache
	flushing.

	All methods for download.file() do tilde-expansion on the path
	name.

	The internal download.file() etc now allow URLs of the form
	ftp://user@foo.bar/ and ftp://user:pass@foo.bar/

    o	duplicated() and unique() are now generic functions with
	methods for data frames (as well as atomic vectors).

    o	factanal() and princomp() use napredict() on their scores, so
	na.action = na.exclude is supported.

    o	Function getNativeSymbolInfo() returns details about a native
	routine, potentially including its address, the library in
	which it is located, the interface by which it can be called
	and the number of parameters.

    o	Functions such as help() which perform library or package index
	searches now use NULL as default for their `lib.loc' argument so
	that missingness can be propagated more easily.	 The default
	corresponds to all currently known libraries as before.

    o	Added function file.rename().

    o	hist.default() allows `breaks' to specify a rule to choose the
	number of classes, and rules "Sturges" (the previous default),
	"Scott" and "FD" (Freedman-Diaconis) are supplied (based on
	package MASS).

    o	Function identical(), a fast and reliable way to test for exact
	equality of two objects.

    o	New generic function is.na<-(), from S4.  This is by default
	equivalent to x[value] <- NA but may differ, e.g. for factors
	where "NA" is a level.

    o	is.xxx reached through do_is are now generic.

    o	La.eigen() and La.svd() have new default methods to use later
	(and often much faster) LAPACK routines.  The difference
	is most noticeable on systems with optimized BLAS libraries.

    o	length() is now generic.

    o	New function .libPaths() for getting or setting the paths to the
	library trees R knows about.  This is still stored in .lib.loc,
	which however should no longer be accessed directly.

    o	Using lm/glm/... with `data' a matrix rather than a data frame
	now gives a specific error message.

    o	loess(), lqs(), nls() and ppr() use the standard NA-handling
	and so support na.action = na.exclude.

    o	mahalanobis() now has a `tol' argument to be passed to solve().

    o	mean() has `data frame' method applying mean column-by-column.
	When applied to non-numeric data mean() now returns NA rather
	than a confusing error message (for compatibility with S4).
	Logicals are still coerced to numeric.

    o	The formula interface to mosaicplot() now allows a contingency
	table as data argument.

    o	new.env() is now internal and allows you to set hashing. Also,
	parent.env() and parent.env<-() are included to provide direct
	access to setting and retrieving environments.

    o	Function nsl() to look up IP addresses of hosts: intended as
	a way to test for internet connectivity.

    o	Ops(), cbind(), diff() and na.omit() methods for time series
	objects moved from package ts to package base.

    o	New option `download.file.method' can be used to set the
	default method for download.file() and functions which use it
	such as update.packages().

    o	order() and sort.list() now implement na.last = FALSE, NA.

    o	Started work on new package management system: packageStatus()
	and friends.

    o	page() has a new `method' argument allowing `method = print'.

    o	png(), jpeg() and bmp() devices now have a `bg' argument to
	set the background color: useful to set "transparent" on png().

    o	Changes to the postscript() device:

	- The symbol font can now be set on a postscript() device, and
	  support has been added for using Computer Modern type-1
	  fonts (including for symbols). (Contributed by Brian D'Urso.)

	- There is now support for URW font families: this will give
	  access to more characters and more appropriate metrics on
	  PostScript devices using URW fonts (such as ghostscript).

	- %%IncludeResource comments have been added to the output.
	  (Contributed by Brian D'Urso.)

    o	predict.ppr() now predicts on `newdata' containing NAs.

    o	princomp() now has a formula interface.

    o	readChar() now returns what is available if fewer characters
	than requested are on the file.

    o	readline() allows up to 256 chars for the prompt.

    o	read.table(), scan() and count.fields() have a new argument
	`comment.char', default `#', that can be used to start
	comments on a line.

    o	New function reg.finalizer() to provide R interface to
	finalization.

    o	reshape() extends reshapeLong, reshapeWide, which are deprecated.

    o	rle() now returns a classed object, has a print method and
	an inverse.

    o	Changes to save() and friends:

	- save() now takes an envir argument for specifying where
	  items to be saved are to be found.

	- A new default format for saved workspaces has been
	  introduced.  This format provides support for some new
	  internal data types, produces smaller save files when saving
	  code, and provides a basis for a more flexible serialization
	  mechanism.

	- Modified `save' internals to improve performance when saving
	  large collections of code.

	- save() and save.image() now take a `version' argument to
	  specify the workspace file-format version to use.  The
	  version used from R 0.99.0 to 1.3.1 is version 1.  The new
	  default format is version 2.	load() can read a version 2
	  saved workspace if it is compressed.

	- save() and save.image() now take a `compress' argument to
	  specify that the saved image should be written using the zlib
	  compression facilities.

	- save.image() now takes an argument `ascii'.

	- save.image() now takes an argument `safe'.  If TRUE, the
	  default, a temporary file is used for creating the saved
	  workspace.  The temporary file is renamed if the save
	  succeeds.  This preserves an existing workspace if the save
	  fails, but at the cost of using extra disk space during the
	  save.

	- save.image() default arguments can be specified in the
	  `save.image.defaults' option.	 These specifications are used
	  when save.image() is called from q() or GUI analogs.


    o	scan() allows unlimited (by R) lengths of input lines, instead
	of a limit of 8190 chars.

    o	smooth.spline() has a new `control.spar' argument and returns
	`lambda' besides `spar'.  spar <= 0 is now valid and allows
	to go more closely towards interpolation (lambda -> 0) than before.
	This also fixes smooth.spline() behavior for "df ~= n - 2". Better
	error messages in several situations.

	Note that spar = 0 is no longer the default and no longer entails
	cross-validation.

    o	stars() has been enhanced; new `mar' argument uses smaller
	mar(gins) by default; further `nrow and `ncol' as S-PLUS,
	`frame.plot', `flip.labels', `lty' and explicit `main', `sub',
	`xlab' and `ylab'.  Note that `colors' has been replaced by
	`col.segments' and there's a new `col.stars'.

	stars() now returns the locations invisibly.

    o	step() is now closer to stepAIC() and so handles a wider range
	of objects (but stepAIC [in MASS] is still more powerful).

    o	symbols() now has automatic xlab and ylab and a main argument
	which eliminates an incorrect warning.	It better checks wrongly
	scaled arguments.

    o	Sys.setlocale() now issues a warning if it fails.

    o	An enhanced function type.convert() is now a documented
	function, rather than just internal to read.table().

    o	warning() allows multiple arguments, following S4's style.

    o	New function with() for evaluating expressions in environments
	constructed from data.

    o	Unix x11() devices can now have a canvas color set, which can
	help to distinguish plotting "white" from plotting
	"transparent".

    o	On Unix, X11(), png() and jpeg() now give informative warnings
	if they fail to open the device.


    o	The startup processing now interprets escapes in the values of
	environment variables set in R_HOME/etc/Renviron in a similar
	way to most shells.

    o	The operator "=" is now allowed as an assignment
	operator in the grammar, for consistency with other languages,
	including recent versions of S-PLUS.  Assignments with "=" are
	basically allowed only at top-level and in braced or
	parenthesized expressions, to make famous errors such as
	"if(x=0) 1 else 2" illegal in the grammar.
	(There is a plan to gradually eliminate the underscore as an
	assignment in future versions of R.)

    o	Finalizers can be registered to be run on system exit for both
	reachable and unreachable objects.

    o	integer addition, subtraction, and multiplication now return NA's
	on overflow and issue a warning.

    o	Printing factors with both level "NA" and missing values
	uses `<NA>' for the missing values to distinguish them.

    o	Added an experimental interface for locking environments and
	individual bindings.  Also added support for "active bindings"
	that link a variable to a function (useful for example for linking
	an R variable to an internal C global).

    o	GNOME interface now has separate colours for input and output
	text (like the windows GUI). These can be modified via the
	properties dialogue.

    o	Output from the GNOME console is block buffered for increased
	speed

    o	The GNOME console inherits standard emacs-style keyboard
	shortcuts from the GtkText widget for cursor motion, editing
	and selection.	These have been modified to allow for the prompt
	at the beginning of the command line.

    o	One can register R functions and C routines to be called at the
	end of the successful evaluation of each top-level expression,
	for example to perform auto-saves, update displays, etc. See
	addTaskCallback() and taskCallbackManager(). See
	http://developer.r-project.org/TaskHandlers.pdf.


DEPRECATED & DEFUNCT

    o	.Alias has been removed from all R sources and deprecated.

    o	reshapeLong(), reshapeWide() are deprecated in favour of reshape().

    o	Previously deprecated functions read.table.url(), scan.url(),
	source.url(), httpclient() and parse.dcf() are defunct.
	Method "socket" for download.file() no longer exists.


DOCUMENTATION CHANGES

    o	`Writing R Extensions' has a new chapter on generic/method
	functions.


UTILITIES

    o	New package `tools' for package development and administration
	tools, containing the QC tools checkFF(), codoc() and undoc()
	previously in package base, as well as the following new ones:

	-  checkAssignFuns() for checking whether the final argument of
	   replacement functions in a package is named `value'.

	-  checkDocArgs() for checking whether all arguments shown in
	   \usage of Rd files are documented in the corresponding
	   \arguments.

	-  checkMethods() for checking whether all methods defined in a
	   package have all arguments of their generic.

	-  checkTnF() for finding expressions containing the symbols `T'
	   and `F'.

    o	R CMD Rd2dvi has more convenient defaults for its output file.

    o	R CMD check now also fully checks the Depends field in the
	package DESCRIPTION file.  It also tests for syntax errors in
	the R code, whether all methods in the code have all arguments
	of the corresponding generic, for arguments shown in \usage but
	not documented in \arguments, and whether replacement functions
	have their final argument named `value'.


C-LEVEL FACILITIES

    o	arraySubscript and vectorSubscript are now available to package
	users.	All "array-like" packages can use a standard method for
	calculating subscripts.

    o	The C routine type2symbol, similar to type2str, returns a symbol
	corresponding to the type supplied as an argument.

    o	The macro SHLIB_EXT now includes `.', e.g. ".so" or ".dll",
	since the Mac uses "Lib" without a `.'.

    o	New Fortran entry points rwarn() and rexit() for warnings and
	error exits from compiled Fortran code.

    o	A new serialization mechanism is available that can be used to
	serialize R objects to connections or to strings.  This
	mechanism is used for the version 2 save format.  For now,
	only an internal C interface is available.

    o	R_tryEval() added for evaluating expressions from C code with
	errors handled but guaranteed to return to the calling C
	routine. This is used in embedding R in other applications and
	languages.

    o	Support for attach()'ing user-defined tables of variables
	is available and accessed via the RObjectTables package
	currently at http://www.omegahat.org/RObjectTables.


BUG FIXES

    o	Fixed share/perl/massage-examples.pl to detect instances of
	par() at the very start of a line.

    o	Fixed Pearson residuals for glms with non-canonical
	link.(PR#1123). Fixed them again for weights (PR#1175).

    o	Fixed an inconsistency in the evaluation context for on.exit
	expressions between explicit calls to `return' and falling off
	the end returns.

    o	The code in model.matrix.default() handling contrasts was
	assuming a response was present, and so without a response was
	failing to record the contrasts for the first variable if it
	was a factor.

    o	diffinv() could get the time base wrong in some cases.

    o	file.append() was opening all files in text mode: mattered
	on Windows and classic Macintosh. (PR#1085)

    o	f[] <- g  now works for factor f.

    o	substr<-() was misbehaving if the replacement was too short.

    o	The version of `packages.html' generated when building R or
	installing packages had an incorrect link to the style sheet.
	The version used by help.start() was correct. (PR#1090)

    o	rowsum() now gives character (not factor codes) as rownames.
	(PR#1092)

    o	plot.POSIX[cl]t now respect the `xaxt' parameter.

    o	It is now possible to predict from an intercept-only model:
	previously model.matrix.default() objected to a 0-column
	model frame.

    o	c.POSIXct was not setting the right classes in 1.3.x.

    o	cor(*, use = "all.obs") <= 1 is now guaranteed which ensures
	that sqrt(1 - r^2) is always ok in cor.test(). (PR#1099)

    o	anova.glm() had a missing drop=FALSE and so failed for some
	intercept-less models.

    o	predict.arima0() now accepts vector as well as matrix
	`newxreg' arguments.

    o	cbind(d,f) now works for 0-column dataframes. This fixes PR#1102.

    o	plot(ts(0:99), log = "y") now works

    o	method "gnudoit" of bug.report() was incorrectly documented as
	"gnuclient" (PR#1108)

    o	saving with ascii=TRUE mangled backslashes. (PR#1115)

    o	frac(,) {and others} now adds a gap appropriately. (PR#1101)

    o	logLik.lm() now uses the correct "df" (nlme legacy code).

    o	closeAllConnections() works again, and closes all sink() diversions.

    o	sink(type="message") works again.

    o	sink.number was (accidentally) returning the result invisibly.

    o	as.POSIXct("NA") (or ..lt) now work; hence, merge(*, all=TRUE) now
	works with dataframes containing POSIXt date columns.

    o	integer(2^30+1) and similar ones do not segfault anymore but duly
	report allocation errors.

    o	seq(0, 0, 1) now works (PR#1133).

    o	reshapeWide() got it wrong if the "i" factor was not sorted (the
	function is now deprecated since reshape() is there, but the bug
	still needed fixing...)

    o	PR#757 was fixed incorrectly, causing improper subsetting of
	pch etc. in plot.formula().

    o	library() no longer removes environments of functions that are
	not defined in the top-level package scope.  Also, packages
	loaded by require() when sourcing package code are now visible
	in the remaining source evaluations.

    o	names(d) <- v  now works (again) for "dist" objects d. (PR#1129)

    o	Workarounds for problems with incompletely specified date-times
	in strptime() which were seen only on glibc-based systems
	(PR#1155).

    o	promax() was returning the wrong rotation matrix. (PR#1146)

    o	The [pqr]signrank and [pqr]wilcox functions failed to check that
	memory has been allocated (PR#1149), and had (often large)
	memory leaks if interrupted.  They now can be interrupted on
	Windows and Mac OS and don't leak memory.

    o	range(numeric(0)) is now c(NA, NA) not NA.

    o	round(x, digits) for digits <= 0 always gives an integral
	answer.	 Previously it might not due to rounding errors in
	fround. (PR#1138/9)

    o	Several memory leaks on interrupting functions have been
	circumvented.  Functions lqs() and mve() can now be
	interrupted on Windows and Mac OS.

    o	image() was finding incorrect breakpoints from
	irregularly-spaced midpoints. (PR#1160)

    o	Use fuzz in the 2-sample Kolmogorov-Smirnov test in package
	ctest to avoid rounding errors (PR#1004, follow-up).

    o	Use exact Hodges-Lehmann estimators for the Wilcoxon tests in
	package ctest (PR#1150).

    o	Arithmetic which coerced types could lose the class
	information, for example `table - real' had a class attribute
	but was not treated as a classed object.

    o	Internal ftp client could crash R under error conditions such
	as failing to parse the URL.

    o	Internal clipping code for circles could attempt to allocate
	a vector of length -1 (related to PR#1174)

    o	The hash function used internally in match(), unique() and
	duplicated() was very inefficient for integers stored as
	numeric, on little-endian chips.  It was failing to hash the
	imaginary part of complex numbers.

    o	fifo() no longer tries to truncate on opening in modes
	including "w". (Caused the fifo example to fail on HP-UX.)

    o	Output over 1024 characters was discarded from the GNOME
	console.

    o	rug() now correctly warns about clipped values also for logarithmic
	axes and has a `quiet' argument for suppressing these (PR#1188).

    o	model.matrix.default was not handling correctly contrasts.arg
	which did not supply a full set of contrasts (PR#1187).

    o	The `width' argument of density() was only compatible with S
	for a Gaussian kernel: now it is compatible in all cases.

    o	The rbinom() C code had a transcription error from the original
	Fortran which led to a small deviation from the intended
	distribution. (PR#1190)

    o	pt(t, , ncp=0) was wrong if t was +/-Inf.

    o	Subsetting grouping factors gave incorrect degrees of freedom
	for some tests in package ctests. (PR#1124)

    o	writeBin() had a memory leak.

    o	qbeta(0.25, 0.143891, 0.05) was (incorrectly) 3e-308. (PR#1201)

    o	Fixed alignment problem in ppr.f on Irix. (PR#1002, 1026)

    o	glm() failed on null binomial models. (PR#1216)

    o	La.svd() with nu = 0 or nv = 0 could fail as the matrix passed
	to DGESVD was not of dimension at least one (it was a vector).

    o	Rownames in xcoef and ycoef of cancor() were wrong if x or y
	was rank-deficient.

    o	lqs() could give warnings if there was an exact fit. (PR#1184)

    o	aov() didn't find free-floating variables for Error() terms when
	called from inside another function

    o	write.table() failed if asked to quote a numerical matrix with
	no row names. (PR#1219)

    o	rlnorm( *, *, sd=0) now returns the mean,
	rnbinom(*, *, prob=1) gives 0, (PR#1218).


	**************************************************
	*						 *
	*	       1.3 SERIES NEWS			 *
	*						 *
	**************************************************


		CHANGES IN R VERSION 1.3.1


NEW FEATURES

    o	massage-examples is now a Perl script and about 50x faster.

    o	On Unix(-alike) systems the default pager is now determined
	during configuration, and is `less' if available, otherwise
	`more' (and not `more -s' as previously).

    o	configure now tests for strptime functions that fail on inputs
	before 1970 (found on Irix).  It no longer checks for the SCSL
	and SGIMATH libraries on Irix.

    o	New formula interface to cor.test() in package ctest.

    o	"NA" is now a valid color name (as NA has been a valid integer
	color).

    o	pairs() function has a new `gap' argument for adjusting the
	spacing between panels.

    o	R CMD check has a new test for unbalanced braces in Rd files.

    o	readBin() has a new argument `signed' to simplify reading
	unsigned 8- and 16-bit integers.

    o	New capabilities() option "cledit".

    o	Modified restore code to give clearer error messages in some cases.



BUG FIXES

    o	Fixed placement of mtext() output (including tick labels)
	when text is perpendicular to axis AND axis is logged
	(PR#997 and PR#865).

    o	rect() and arrows() now respond to setting of par(xpd)

    o	abline() now responds to the setting of par(xpd), including
	via the "..." argument (PR#750).

    o	Using cat() to a gzfile() connection no longer compresses poorly
	(at the expense of some latency).

    o	The `exact' p-values for the two-sided two-sample
	Kolmogorov-Smirnov test in 1.3.0 were for the wrong tail.

    o	In the HTML conversion of .Rd files, \link[foo]{bar} was
	ignoring [foo] outside \code{} statements.

    o	lm.influence(), plot.lm(), influence.measures() and the
	related diagnostic measures now handle lm() fits with
	na.action=na.exclude.

    o	Eliminated segmentation fault in while loops without braces
	in their bodies.

    o	barplot did not accept NA heights unless ylim was specified.

    o	predict.lm() failed with single-column model matrix (PR#1018).

    o	legend() now also works with 100s of entries (thanks to
	M. Schlather).

    o	A long-standing bug leading to inaccuracy in polyroot() has been
	fixed (PR#751)

    o	A very old bug with eval() not handling a numeric `envir' argument
	according to specifications has been fixed. [This in particular
	broke ported S-PLUS code that used eval(..., sys.parent())]. Also,
	eval() now checks that a numeric `envir' has length one to prevent
	accidental passing of matrices instead of data frames.

    o	The C code underlying nlm(f, *) now also works correctly when f(x)
	returns +Inf {nlm() itself *did* work!}.

    o	pdfcolor.tex is now included in doc/manual, as pdftex seems no
	longer to include it.

    o	Fixed protect bug in save() code that might have been responsible
	for occasionally saving corrupted workspaces.

    o	capabilities("X11") now reports if X11 is available in this
	session, thereby giving the correct answer if --gui=none was
	specified.

    o	Rd files with ,, inside \code{} were treating this as a
	ligature in LaTeX: now corrected in Rdconv.

    o	dlopen on Compaq Tru64 was finding the wrong entry points:
	worked-around by using different names in the modules.

    o	plot.mts() allows a type argument again (broken in 1.3.0: PR#1010).

    o	scan() has a limit of 8190 on the length of char strings, and
	now warns if it is exceeded (when the string has always been
	truncated).

    o	par adj now accepts values of integer mode (such as text(adj=0:1)).

    o	horizontal adj values outside the range [0, 1] are now
	supported on devices with canHAdj==1 (Windows devices, xfig).

    o	xtabs() without a response was ignoring drop.unused.levels=TRUE.

    o	readLines(ok=FALSE) was not generating an error when it should.

    o	princomp(covmat=) has been broken.

    o	Many documentation clean-ups: formerly undocumented arguments,
	use of T/F rather than TRUE/FALSE.

    o	df[] <- foo now works for data frames (PR#1047).

    o	nargs() was documented incorrectly.

    o	Using seq.POSIXt(by="2 weeks") was stepping by single weeks
	(PR#1046).

    o	dummy.coef.lm was not handling complex terms like z:I(x).
	It now either does or warns and gives NAs (PR#1048).

    o	predict.mlm() was broken (PR#1049).

    o	ksmooth (in package modreg) was using points to the left
	of the kernel under some circumstances (PR#1050).

    o	attr(x, "class") <- character(0) was segfaulting.  Similar problem
	with "comment" attribute also fixed.

    o	loadings() results from PCA (as well as from factor analysis)
	are now printed by print.loadings.

    o	Using chol() on an non-positive-definite matrix gave an
	misleading error message (PR#1061).

    o	as.character() on a language object was truncating to about 70
	characters: the internal limit (from the deparse code) is now the
	maximum possible 500.

    o	X11() device was failing to re-initialize correctly after all
	devices were shut down, so the colortype could not be changed
	and some systems showed protocol errors. (PR#1065)

    o	Converting Inf and NaN values by as.character() and reading by
	scan() was supported by strtod on some platforms and not
	others: these are now handled by R itself. (PR#1072)

    o	hclust(dist(1)) doesn't loop infinitely but signal an error.

    o	cutree() can now cut outside heights and does not return
	garbage	for h >= max(tree$heights) anymore. (PR#1067)

    o	interaction(...,drop=F) returned an object looking like a
	factor, but with storage mode "double", confusing
	model.matrix.default (PR#1003)

    o	splineDesign(*, ord=) and others give better error messages for
	wrong `ord' (and have slightly improved documentation).


		CHANGES IN R VERSION 1.3.0


NEW FEATURES

    o	Changes to connections:

	-  New function url() to read from URLs.  file() will also
	   accept URL specifications, as will all the functions which
	   use it.

	-  file connections can now be opened for both reading and writing.

	-  Anonymous file connections (via file()) are now supported.

	-  New function gzfile() to read from / write to compressed files.

	-  New function fifo() for connections to / from fifos (on Unix).

	-  Text input from file, pipe, fifo, gzfile and url connections
	   can be read with a user-specified encoding.

	-  New functions readChar() and writeChar() to read character
	   strings with known lengths and no terminators, and to write
	   user-specified lengths from strings.

	-  sink() now has a stack of output connections, following S4.

	-  sink() can also be applied to the message stream, to capture
	   error messages to a connection.  Use carefully!

	-  seek() has a new `origin' argument.

	-  New function truncate() to truncate a connection open for
	   writing at the current position.

	-  Socket connections via function socketConnection().

	-  The `blocking' argument for file, fifo  and socket connections
	   is now operational.

    o	Changes to date/time classes and functions:

	-  Date/time objects now all inherit from class "POSIXt".

	-  New function difftime() and corresponding class for date/time
	   differences, and a round() method.

	-  Subtraction and logical comparison of objects from different
	   date/time classes is now supported.	NB: the format for the
	   difference of two objects of the same date/time class has
	   changed, but only for objects generated by this version, not
	   those generated by earlier ones.

	-  Methods for cut(), seq(), round() and trunc() for date/time
	   classes.

	-  Convenience generic functions weekdays(), months(), quarters()
	   and julian() with methods for "POSIXt" objects.

    o	Coercion from real to integer now gives NA for out-of-range
	values, rather than the most extreme integer of the same sign.

    o	The Ansari-Bradley, Bartlett, Fligner-Killeen, Friedman,
	Kruskal-Wallis, Mood, Quade, t, and Wilcoxon tests as well as
	var.test() in package ctest now have formula interfaces.

    o	Matrix multiplication functions %*% and crossprod() now use a
	level-3 BLAS routine dgemm.  When R is linked with the ATLAS
	or other enhanced BLAS libraries this can be substantially
	faster than the previous code.

    o	New functions La.eigen() and La.svd() for eigenvector and
	singular value decompositions, based on LAPACK.	 These are
	preferred to eigen() and svd() for new projects and can make
	use of enhanced BLAS routines such as ATLAS.  They are
	used in cancor(), cmdscale(), factanal() and princomp()
	and this may lead to sign reversals in some of the output of
	those functions.

    o	Provided the Fortran compiler can handle COMPLEX*16, the
	following routines now handle complex arguments, based on
	LAPACK code.

	qr, qr.coef, qr.solve, qr.qy, qr.qty, solve.default, svd, La.svd.



    o	aperm() uses strides in the internal C code and so is
	substantially faster (by Jonathan Rougier).

    o	The four bessel[IJKY](x,nu) functions are now defined for nu < 0.

    o	[dpqr]nbinom also accept an alternative parametrization via the
	mean and the dispersion parameter (thanks to Ben Bolker).

    o	Generalised "birthday paradox" functions [pq]birthday.

    o	boxplot() and bxp() have a new argument `at'

    o	New function capabilities() to report optional capabilities
	such as jpeg, png, tcltk, gzfile and url support.

    o	New function checkFF() for checking foreign function calls.

    o	New function col2rgb() for color conversion of names, hex, or
	integer.

    o	coplot() has a new argument `bar.bg' (color of conditioning bars),
	gives nicer plots when the conditioners are factors, and allows
	factors for x and y (treated almost as if unclass()ed) using new
	argument `axlabels'.  [original ideas by Thomas Baummann]

    o	`hessian' argument added to deriv() and its methods.  A new function
	deriv3() provides identical capabilities to deriv() except that
	`hessian' is TRUE by default.
	deriv(*, *, func = TRUE) for convenience.

    o	New dev.interactive() function, useful for setting defaults for
	par(ask=*) in multifigure plots.

    o	dist() in package mva can now handle missing values, and
	zeroes in the Canberra distance.

    o	The default method for download.file() (and functions which use
	it such as update.packages()) is now "internal", and uses code
	compiled into R.

    o	eigen() tests for symmetry with a numerical tolerance.

    o	New function formatDL() for formatting description lists.

    o	New argument `nsmall' to format.default(), for S-PLUS
	compatibility (and used in various packages).

    o	?/help() now advertises help.search() if it fails to find a topic.

    o	image() is now a generic function.

    o	New function integrate() with S-compatible call.

    o	New function is.unsorted() the C version of which also speeds up
	.Internal(sort()) for sorted input.

    o	is.loaded() accepts an argument PACKAGE to search within
	a specific DLL/shared library.

    o	Exact p-values are available for the two-sided two-sample
	Kolmogorov-Smirnov test.

    o	lm() now passes `...' to the low level functions for regression
	fitting.

    o	Generic functions logLik() and AIC() moved from packages nls
	and nlme to base, as well as their *.lm methods.

    o	New components in .Machine give the sizes of long, long long and
	long double C types (or 0 if they do not exist).

    o	merge.data.frame() has new arguments, `all[.xy]' and `suffixes',
	for S compatibility.

    o	model.frame() now calls na.action with the terms attribute set
	on the data frame (needed to distiguish the response, for
	example).

    o	New generic functions naresid(), napredict() and naprint()
	(formerly in packages survival5 and MASS, also used in rpart).
	Also na.exclude(), a variant on na.omit() that is handled
	differently by naresid() and napredict().

	The default, lm and glm methods for fitted, residuals, predict
	and weights make use of these.

    o	New function oneway.test() in package ctest for testing for
	equal means in a one-way layout, assuming normality but not
	necessarily equal variances.

    o	options(error) accepts a function, as an alternative to
	an expression.	(The Blue Book only allows a function; current
	S-PLUS a function or an expression.)

    o	outer() has a speed-up in the default case of a matrix outer
	product (by Jonathan Rougier).

    o	package.skeleton() helps with creating new packages.

    o	New pdf() graphics driver.

    o	persp() is now a generic function.

    o	plot.acf() makes better use of white space for `nser > 2', has
	new optional arguments and uses a much better layout when more
	than one page of plots is produced.

    o	plot.mts() has a new argument `panel' providing the same
	functionality as in coplot().

    o	postscript() allows user-specified encoding, with encoding files
	supplied for Windows, Mac, Unicode and various others, and with
	an appropriate platform-specific default.

    o	print.htest() can now handle test names that are longer than
	one line.

    o	prompt() improved for data sets, particularly non-dataframes.

    o	qqnorm() is now a generic function.

    o	read.fwf() has a new argument `n' for specifying the number of
	records (lines) read in.

    o	read.table() now uses a single pass through the dataset.

    o	rep() now handles lists (as generic vectors).

    o	scan() has a new argument `multi.line' for S compatibility,
	but the default remains the opposite of S (records can cross
	line boundaries by default).

    o	sort(x) now produces an error when x is not atomic instead of
	just returning x.

    o	split() now allows splitting on a list of factors in which case
	their interaction defines the grouping.

    o	stl() has more optional arguments for fine tuning, a summary()
	and an improved plot() method.

    o	New function strwrap() for formatting character strings into
	paragraphs.

    o	New replacement functions substr<-() and substring<-().

    o	Dataset swiss now has row names.

    o	Arguments `pkg' and `lib' of system.file() have been renamed to
	`package' and `lib.loc', respectively, to be consistent with
	related functions.  The old names are deprecated.  Argument
	`package' must now specify a single package.

    o	The Wilcoxon and Ansari-Bradley tests now return point
	estimators of the location or scale parameter of interest along
	with confidence intervals for these.

    o	New function write.dcf() for writing data in Debian Control File
	format.	 parse.dcf() has been replaced by (much faster)	internal
	read.dcf().

    o	Contingency tables created by xtabs() or table() now have a
	summary() method.

    o	Functions httpclient(), read.table.url(), scan.url() and
	source.url() are now deprecated, and hence method="socket' in
	download.file() is.  Use url connections instead: in
	particular URLs can be specified for read.table(), scan() and
	source().

    o	Formerly deprecated function getenv() is now defunct.

    o	Support for package-specific demo scripts (R code).  demo() now
	has new arguments to specify the location of demos and to allow
	for running base demos as part of `make check'.

    o	If not explicitly given a library tree to install to or remove
	from, respectively, R CMD INSTALL and R CMD REMOVE now operate
	on the first directory given in `R_LIBS' if this is set and
	non-null, and the default library otherwise.

    o	R CMD INSTALL and package.description() fix some common problems
	of DESCRIPTION files (blank lines, ...)

    o	The INSTALL command for package installation allows a `--save'
	option.	 Using it causes a binary image of the package contents
	to be created at install time and loaded when the package is
	attached.  This saves time, but also uses a more standard way
	of source-ing the package.  Packages that do more than just
	assign object definitions may need to install with `--save'.
	Putting a file `install.R' in the package directory makes
	`--save' the default behavior.	If that file is not empty, its
	contents should be R commands executed at the end of loading
	the image.

	There is also a new command line option `--configure-vals' for
	passing variables to the configure script of a package.

    o	R CMD check now also checks the keyword entries against the list
	of standard keywords, for code/documentation mismatches (this
	can be turned off by the command line option `--no-codoc'), and
	for sufficient file permissions (Unix only).  There is a new check
	for the correct usage of library.dynam.

	It also has a new command line option `--use-gct' to use
	`gctorture(TRUE)' when running R code.

    o	R CMD Rd2dvi has better support for producing reference manuals
	for packages and package bundles.

    o	configure now tests for the versions of jpeg (>= 6b), libpng (>=
	1.0.5) and zlib (>= 1.1.3).  It no longer checks for the
	CXML/DXML BLAS libraries on Alphas.

    o	Perl scripts now use Cwd::cwd() in place of Cwd::getcwd(), as
	cwd() can be much faster.

    o	R::Dcf.pm can now also handle files with more than one record
	and checks (a little bit) for continuation lines without leading
	whitespace.

    o	New manual `R Installation and Administration' with fuller
	details on the installation process: file `INSTALL' is now a
	brief introduction referencing that manual.

    o	New keyword `internal' which can be used to hide objects that
	are not part of the API from indices like the alphabetical lists
	in the HTML help system.

    o	Under Unix, shlib modules for add-on packages are now linked
	against R as a shared library (`libR') if this exists.	(This
	allows for improved embedding of R into other applications.)

    o	New mechanism for explicitly registering native routines in a
	DLL/shared library accessible via .C(), .Call(), .Fortran() and
	.External().  This is potentially more robust than the existing
	dynamic lookup, since it checks the number of arguments, type of
	the routine.

    o	New mechanism allowing registration of C routines for converting
	R objects to C pointers in .C() calls.	Useful for references to
	data in other languages and libraries (e.g. C and hdf5).

    o	The internal ftp/http access code maintains the event loop, so
	you can download whilst running tcltk or Rggobi, say.  It can
	be hooked into package XML too.



BUG FIXES

    o	boxplot.stats() now returns the correct `n' component in the case of
	NAs. This also affects `conf', the notch length (PR#967).

    o	the "coef = 0" fix (PR#917) to boxplot.stats() broke
	boxplot.stats(do.out = FALSE).

    o	curve(* , add = FALSE) now works correctly again if used when
	par("xlog") is true.

    o	Printing a dataframe with a column called "row.names" or
	"check.names" omitted the column.

    o	data.frame(a=1, b=2)[1, -(1:2)]	 now works, giving an empty
	data frame.  as.matrix(df), deparse(), dput() and str() now work
	for empty data frames.

    o	dbeta() could return zero erroneously on some platforms where
	roundoff makes e.g. 1.3 - 1 > (1.3 + 1) - 2 (Solaris and HP-UX
	were affected). (PR#970)

    o	pointer protection in deriv() (PR#953)

    o	expand.data.frame() didn't interpret its subset= argument in
	the data frame. (PR#979 et al., fix from Greg Warnes)

    o	format() on character arrays was losing the dimensions.

    o	hist.default() was ignoring its `probability' argument for
	equi-spaced breaks.

    o	Occasionally insane results of is.nan(NULL), is.na(NULL) (PR#952)

    o	ks.test() in package ctest now had the one-sided alternatives in
	the one-sample case reversed (PR#934).

    o	ls.str() and lsf.str() now work better with pos > 1, and are
	correctly documented (PR#899).

    o	plot(1:2, xaxs = "i") now gives both "1.0" and "2.0" x-axis labels.

    o	promax() was not using its `m' argument (m=4 was always used).

    o	qr.X() was ignoring pivoting (which happens only in
	rank-deficient cases).

    o	sign of Pearson residuals was wrong for reciprocal link (PR#862)

    o	The algorithm for determining starting estimates in the SSfpl
	self-starting model in the nls package was changed following a
	suggestion by Phillipe Grosjean <phgrosje@ulb.ac.be>

    o	svd(x)$v was not a matrix when x had only 1 row (PR#963).

    o	symnum(x) behaves more reasonably for zero length or non-numeric x.

    o	The implementation of sys.function() did not work when the
	current function was already a function (e.g., a closure).

    o	tapply() had "..." argument after simplify=, which made it
	incompatible with S when passing additional unnamed arguments to FUN.

    o	use formula environments in xy.coords() (PR#932)


    o	Unused entry points in `src/appl/fortran.c' and `Fortran.h'
	have been removed.

    o	Unused directory `src/f2clib' and header `src/include/R_ext/f2c.h'
	have been removed.

    o	The documentation and parts of the parse/deparse mechanism
	indicated that there was an operator `%'. Corrected (PR#925).

    o	Fixed some cases where the deparser gave code that threw a
	syntax error when parsed.

    o	Using a pushback with more than two lines at a time could crash.

    o	Eliminate or warn on use of .Last.value in help examples, since
	.Last.value is only set from top-level expressions (and was
	incorrectly documented).

    o	asInteger was ignoring integer overflow (PR#929 and others).

    o	approxfun(*, ties = <fun>) could return garbage when there were ties;
	ties = "ordered" was incorrect--also for approx()-- when there was
	a tie at the very right.


	**************************************************
	*						 *
	*	       1.2 SERIES NEWS			 *
	*						 *
	**************************************************


		CHANGES IN R VERSION 1.2.3

NEW FEATURES

    o	Support for configuration and building the Unix version of R
	under Mac OS X.	 (The `classic' Macintosh port is `Carbonized'
	and also runs under that OS.)

    o	dotchart() and stripchart() become the preferred names for
	dotplot() and stripplot(), respectively.  The old names are now
	deprecated.

    o	Functions in package ctest now consistently use +/-Inf rather
	than NA for one-sided confidence intervals.



BUG FIXES

    o	`Writing R Extensions' incorrectly described an entry point
	`fmod' which was not included in the R binary on most systems.
	The entry point has been removed, to avoid any confusion with
	the standard C entry point of the same name.

    o	Printing of kernels in package ts was unreliable: the internal
	representation was correct.

    o	A problem with "..." in substitutions has been fixed (PR#860).

    o	Various strangeness with match.call() and "..." has been fixed
	(PR#813).

    o	sys.function() could return an unevaluated promise, messing up
	formals() and match.arg() (PR#872)

    o	Deparsing or dumping attributes with non-standard names was
	not quoting the name (PR#871).

    o	We now use match.fun() in tapply() so that it won't get trapped
	by non-functions masking FUN.

    o	The `nmax' argument in scan(what=list(...), nmax=300) was
	counting blank lines, although they were said to be ignored.
	This affected using read.table on files with blank lines in
	1.2.2, and using `n' with `what' a list.

    o	as.numeric(), as.integer(), as.complex() returned zero on
	completely blank strings. Now they return NA. (PR#870)

    o	Overflow in deparse() in terms(formula) with very long left-hand
	side fixed.  (PR#873)

    o	lowess(c(1:3, 7:5)) now should give the same on different platforms,
	since now in the C code (int)(f*n + 1e-7) is used.

    o	curve(*, add = TRUE) now works properly with active log scales.

    o	rt() could give different results on different platforms as
	the order of evaluation of calls to random numbers was not
	fully defined.	This affected the Mac port.

    o	ppr() inside nested calls sometimes failed to find objects
	due to a typo in the eval call in ppr.formula.

    o	qchisq(0.025, 31, ncp=1, lower.tail=FALSE) now works.  (PR#875)

    o	dchisq with integer x, df and ncp sometimes gave incorrect
	results on i686 Linux.

    o	Cancelling a quit caused quit() not to ask next time it was called.

    o	Some complicated operations with "..." didn't work.

    o	Missingness was not correctly propagated in some cases.

    o	eigen() segfaulted on 0-dimensional matrices.

    o	nls( ~ rhs, ..)	 now works (formula with empty left hand side).

    o	The fuzz added in hist() for 1.2.2 broke the logic testing for
	equidistant breakpoints.

    o	Calls to replacement functions ("f<-") lost argument names
	(PR#888).

    o	is.na() and is.nan() gave random results on lists containing
	zero-length objects.

    o	cor(), cov() and var() gave a result on a zero-length argument
	(now an error).	 cov(x, NULL) and cor(x, NULL) are now errors
	if x is a vector.  (PR#883).

    o	?smooth.spline now properly describes `spar' which is *not*
	lambda.	 smooth.spline(1:20, spar = 50) gives an error instead
	of silent nonsense.  print.smooth.spline() now makes use of a
	digits argument.

    o	Confidence intervals for wilcox.test() had the samples reversed
	in the two-sided case (PR#895), and sometimes got continuity
	correction wrong (PR#896).

    o	Using out-of-range font values in text() on a postscript()
	device on Windows could crash.	.ps.prolog was incorrectly
	named in some of the documentation.  (PR#914)

    o	Warning messages of > 8191 chars could crash R (PR#902), as
	could errors.  Now they are truncated to 8191 chars on
	machines which have vsnprintf (almost all).

    o	range() now works properly for date-time objects.

    o	contour() could loop infinitely (PR#897).

    o	R-lang manual had precedence of %% wrong (PR#879).

    o	try() constructs lost protection of R_alloc'ed memory (PR#877).

    o	Documented that as.numeric() dispatches to as.double.foo methods
	(PR#918.1).

    o	httpclient() (and the "socket" method of download.file) skipped ^V
	rather than ^Z in input (if drop.ctrl.z = TRUE, the default).

    o	boxplot(*, range = 0) and boxplot.stats(*, coef = 0) now
	don't return outliers anymore (PR#917).

    o	segmentation fault with tmp[[1,]] (PR#904)

    o	incorrect "..." handling in plot.factor (PR#830)



		CHANGES IN R VERSION 1.2.2


NEW FEATURES

    o	The Macintosh port becomes a full member of the R family and its
	sources are incorporated as from this release.
	See `src/macintosh/INSTALL' for how that port is built.

    o	The API header files and export files `R.exp' are released under
	LGPL rather than GPL to allow dynamically loaded code to be
	distributed under licences other than GPL.

    o	postscript() and xfig() devices now make use of genuine Adobe
	afm files, and warn if characters are used in string width or
	height calculations that are not in the afm files.

    o	Configure now uses a much expanded search list for finding a
	FORTRAN 77 compiler, and no longer disallows wrapper scripts for
	this compiler.

    o	New Rd markup \method{GENERIC}{CLASS} for indicating the usage
	of methods.

    o	print.ftable() and write.ftable() now have a `digits' argument.

    o	undoc() has a new `lib.loc' argument, and its first argument is
	now called `package'.


BUG FIXES

    o	The behaviour of polygon() with NA coordinate values is now
	documented.

    o	polygon() now correctly recycles the values of border and lty.
	Thanks to Denis White.

    o	readBin() and writeBin() were not always making good use of
	long types (such as long double) when available.

    o	The C function fprec was not handling very small denormalized
	numbers correctly.  This affected the way they were printed on
	Windows, for example.

    o	legend() now draws points after lines allowing "empty dots on
	lines" thanks to Ben Bolker.

    o	Setting row/column names preserves the names of the dimnames
	(PR#809).

    o	Using help() after help.start() on Unix was failing to find
	the linked help files if more than one package was loaded (as
	now happens by default).

    o	scan now sets the maximal sizes internally when `what' is a list
	from `nmax' and failing that `nlines'.	This uses memory much
	more efficiently if `nmax' is specified.  read.table() makes use
	of this.

    o	The FORTRAN code used is now much closer to ANSI compliance.

    o	cov.rob() gives a useful error message on nearly-degenerate
	matrices.

    o	summary() on a data frame was computing results to a precision
	based on options("digits") (default 4), not its `digits'
	argument.  Now results are computed to full precision but
	formatted using `digits'.

    o	summary(m, digits=*) also properly works for matrices.

    o	When returning parameters from .C/.Fortran, the OBJECT field was
	not copied even though class attributes were (PR#834).

    o	There was a spurious warning from the X11 driver on 100 dpi
	displays (PR#840, fix from Tom Vogels).

    o	scan() was reading all-blank numeric fields as zero.
	Should be read as NA, and are now.

    o	dnbinom(*, size, *) now works again for size < 1 (PR#842).

    o	dgeom(*, p = 0) and pgeom(*, p = 0) don't give NaN anymore.

    o	smooth.spline() allows zero weights again.

    o	aperm() fix for list arg; aperm(*, resize=FALSE) now works with
	dimnames (by dropping them).

    o	The xfig() driver was not closing unclosed polygons as the R
	driver expected (but did not document).

    o	spec.ar() now handles order 1 correctly.

    o	Add fuzz to prevent anomalies with hist().

    o	print.matrix() checks length of rowlab, collab (PR#850)

    o	add1.glm() was using the wrong weights for binomial glms in
	cbind(successes, failures) ~ lhs  form, since 1.2.0.

    o	Eliminate packing of the `structRstart' structure, which was
	probably non-ISO C and caused some compilers problems (PR#852).

    o	all.vars() no longer returns empty `names' (PR#829).

    o	dotplot() passes `cex' down to the mtext() calls used for the
	labels (PR#816).

    o	The pictex() driver was drawing polylines incorrectly (PR#845).

    o	In the event of a fatal X11 error (this can be generated under FVWM
	by selecting Destroy), the input handler would loop, leaving the
	"please save work and shut down R" advice useless. There should now
	be an opportunity for a relatively graceful exit.

    o	polyroot() misbehaved if all coefficients except that of the highest
	degree term were zero (partial fix for PR#751)

    o	spline(method="natural") was extrapolating incorrectly (both
	to the left and to the right, for different reasons).  (PR#653)

    o	Line clipping was incorrect for log-plots. (PR#839)

    o	Add explicit test for rank-deficient residuals to summary.manova().

    o	The help search data bases did not contain the data from the
	platform-specific help files.

    o	parse.dcf() and hence package.contents() now work with a warning
	for empty contents' files.

    o	which.min() and which.max() now properly work for 0-length and
	NA-only arguments.



		CHANGES IN R VERSION 1.2.1


NEW FEATURES

    o	New functions factanal(), varimax(), promax() and examples in
	package mva.

    o	New functions readBin() and writeBin() to transfer binary data
	to and from connections.

    o	merge() is partially moved to C to reduce its memory usage.

    o	library(help = PKG) now displays the contents of the package's
	DESCRIPTION file in addition to its INDEX.

    o	Sd2Rd can handle S4-style documentation too: see `Writing R
	Extensions'.

    o	prompt() now also works with a character argument (useful for
	producing many *.Rd files in a loop).

    o	The Unix front-end shell script now ignores a value for R_HOME
	found in the environment.

    o	Connections functions such as file() now accept a description of
	length > 1, with a warning.

    o	All text-mode connections now accept input with LF, CR or CRLF
	line endings.  This means that readLines() can be used on DOS
	files and source() on Mac files, for example.

	Also, CRLF-terminated files can be used as stdin on Unix, and
	files with last lines without an EOL mark can be used as stdin
	and source()-ed on Unix and Windows.

    o	DESCRIPTION file has a new recommended `Maintainer:' field.

    o	stars() now uses a larger "cex" for the labels, and cex and lwd
	are now arguments. Further, the argument names (xlim, ylim,
	axes) are now consistent with other plot functions.  The key symbol
	is not clipped anymore into the plot region by default.

    o	Date-time quantities are now printed with the timezone, if known.

    o	R CMD build now ignores all files specified (via Perl regexps)
	in file `.Rbuildignore' in the top-level source	directory of a
	package.

    o	Horizontal boxplots are possible with  horizontal = TRUE.

    o	all.equal() on lists now compares them as generic vectors, that
	is they are equal if have identical names attributes and
	all components are equal.

    o	Invalid lines in .Renviron now give warnings when R is started.

    o	Argument `na.last' implemented for rank().


BUG FIXES

    o	There have been many small improvements/corrections in the
	documentation. In particular:

	The help pages for lm and glm now describe the fitted objects.

	is.vector() is now correctly documented: complex vectors and
	lists return TRUE.

    o	The default sortedXyData constructor in the nls package now
	handles missing values in the response.

    o	On startup, file .RData is now restored *after* the site and
	user profiles are loaded (if at all).  This is as previously
	documented.

    o	as.POSIXlt (and *ct) operating on a character string
	only extracted the date (and not the time) in some cases.

    o	as.POSIXct() on character objects was ignoring `tz'.

    o	codoc(ignore.generic.functions = TRUE) works again.

    o	Explicitly close files opened by sink() for OSes (such as
	Windows) that benefit from it.

    o	Prevent closing the sink connection (which would be a silly
	thing to do).

    o	showConnections(all = TRUE) was sometimes counting connections
	incorrectly, and so not showing some closed ones.

    o	ts(1:10, start= c(1999,6), end = c(2000,3), frequency = 12)
	now prints both years (as it should).

    o	Monthly multivariate time series now print proper month names
	in all cases.

    o	print.stl(), print.princomp() and print.prcomp() now pass on
	`digits =' etc.

    o	prompt() now produces a \usage{} line for data frames and
	other datasets, as documented in `Writing R Extensions'.

    o	glm() now returns correct linear predictor and fitted values
	for zero-weight cases.

    o	scan(strip.white=TRUE) and readline() could give incorrect
	answers when an input field was empty or blank.

    o	dchisq() now behaves better for large values of its ncp parameter.

    o	besselJ(*, nu) is now ok for nu < 1; fix improves accuracy of
	other values by a few bits as well.

    o	The convergence criterion in the Fortran SVD code has been
	changed to circumvent spurious convergence errors when
	comparing extended-precision quantities on ix86 Linux (and
	some compilers and options).

    o	Rdindex now handles multi-line \title{}'s correctly.

    o	Add weights.glm() so that plot.lm() gets the correct weights from
	glm objects (the ones that go with deviance residuals not the
	working residuals).

    o	Printing a language object (e.g. a formula) in a list was
	clobbering the buffer holding the tag labels which then were
	lost in subsequent lines of printout (PR#746).

    o	aic in family() objects is now computed more precisely using
	dxxxx(log=TRUE).  For binomial fits the value was wrong for
	models specified via proportions and weights (PR#796).

	Avoid NaN values in aic where n = 0 occurs.

    o	Using non-integer numbers of successes in a binomial glm (as
	formerly in demo(lm.glm)) now gives a warning, as the theory and
	in particular the AIC value is not applicable.

    o	demo(is.things) works again {is.ALL() doesn't call methods
	anymore}.

    o	persp(*, nticks = nn) now works (better) for too small nn.
	persp(*, main = t1, sub= t2) now work (as always documented).

    o	Printing of attributes of a list element no longer precedes
	`attr' by the tag (PR#715).

    o	It is no longer possible to use df[foo] to select non-existent
	columns in df and so create an invalid object of class
	"data.frame" (PR#698).

    o	edit.data.frame() was trying to set row.names on a list, which
	is no longer allowed.

    o	In the \link[pkg]{topic}, `pkg' was not being used if `topic'
	was found in a package in .lib.loc.  Now `pkg' is always used.

    o	plot() with small relative ranges gave an error, which e.g. broke
	library(ts); plot(stl(ts(rep(1:7, 15), freq = 7), s.win = "per"))

    o	Using scan() with a 0-length `what' argument now gives an error
	message rather than a segfault.

    o	Loading .Random.seed could extremely rarely and with some
	generators reject a value as NA_INTEGER when it was valid.

    o	save(..., ascii=TRUE) created broken files when saving strings
	containing special characters (ASCII code > 127).

    o	mean(c(1,NA,NA,NA)[-1], trim = .1, na.rm = TRUE) doesn't give an
	error anymore.

    o	As the supplied afm files are not properly in the ISOLatin1
	encoding, the font metric for "-" was wrong since 0.63 on a
	postscript/xfig device, and randomly wrong in 1.2.0.  It will
	now be correct (but the files remain incorrect: C45 is "minus"
	not "hyphen" and there are missing slots).

	Metrics for the duplicated characters (acute, dieresis,
	macron, space) in ISOLatin1 encoding are now correct for both
	occurrences: previously only one was present.

    o	The data-time functions try harder to guess the DST setting
	when the OS does not know, as some OSes were printing times
	in DST if this was marked as unknown.

    o	Setting par(pty=) after par(pin=) or par(plt=) was having no
	effect until the margins were set.

    o	Nested \describe sections in .Rd files have (again) nested
	indentation when converted to text.

    o	Concatenation of C strings by ## is no longer used, to avoid
	spurious warnings from some recent versions of gcc.

    o	dev.copy2eps() allows a `paper' argument to be passed to
	postscript().

    o	file.show() handles the case of zero files better.

    o	formula.lm uses object$formula if it exists, in preference
	to object$terms.

    o	strsplit() is corrected for an empty split pattern.

    o	kronecker() now does a better job when creating dimnames.

    o	Better handling of input dimnames in fourfoldplot().



		CHANGES IN R VERSION 1.2.0


NEW FEATURES

    o	There is a new memory management system using a generational
	garbage collector.  This improves performance, sometimes
	marginally but sometimes by double or more.  The workspace is
	no longer statically sized and both the vector heap and the
	number of nodes can grow as needed.  (They can shrink again,
	but never below the initially allocated sizes.)	 See ?Memory
	for a longer description, including the new command-line
	options to manage the settings.

    o	values of `--min-nsize' up to 50M (2Gb on 64-bit Solaris) are
	allowed.

    o	A (preliminary) version of S4-like connections has been added,
	and most functions which take a "file" argument can now work
	with a connection as well as a file name.  For more details,
	see the chapter on Connections in the R Data Import/Export
	manual.

    o	New command-line option `--no-restore-history' implied by
	`--vanilla'.

    o	Command-line option `--no-restore' is now `--no-restore-data'
	and `--no-restore' implies `--no-restore-*' (currently `data'
	and `history').

    o	The more recent GNU regex from grep-2.4.2 is used.  This uses
	locale-based ordering for ranges on platforms with strcoll.

    o	The print routines now escape " (as \") in a character string
	only when it is printed as a quoted string.  This makes
	print(, quote=FALSE) and cat() consistent.


    o	The standard methods for add1() and drop1() now attempt to cope
	with missing values by using a subset of the data that is
	`cleaned' by na.action for the maximal model under consideration.

    o	anova() for 3 or more lm objects now behaves compatibly	with S
	and anova.glmlist().  The old behaviour is still available by
	calling anovalist.lm() directly.

    o	anova() for multiple lm and glm objects no longer truncates the
	formula printed. There is much more extensive documentation
	for anova() methods.

    o	New method as.data.frame.table() for converting the array-based
	representation of a contingency table to a data frame containing
	the classifying factors and the corresponding counts.

    o	New function assocplot() for producing Cohen-Friendly
	association plots.

    o	autoload() accepts lib.loc and other arguments to library()

    o	bxp() has new argument `frame.plot', as plot.default().

    o	contour() now has `axes' and `frame.plot' args.

    o	contrasts(, FALSE) now always returns an identity matrix,
	to make model.matrix compatible with S. This affects models
	such as lm(y ~ o - 1) where o is an ordered factor.

    o	`where' command added to debug().

    o	demo(dynload) (which used the superseded call_R interface)
	has been removed.

    o	Class "dendrogram" in package mva providing general support
	for tree-like structures (plotting, cutting, ...).

    o	dev.copy2eps() and dev2bitmap() preserve the aspect ratio of the
	copied device if just one of `width' and `height' is specified.

    o	dump() has new argument append, argument `fileout' has been
	renamed to `file' (for consistency with all other functions).

    o	edit.default() now checks for an unset `editor' argument, and
	terminates with an error if the editor cannot be run.

    o	The `mode' argument of exists() and get() is interpreted
	as mode(x) rather than typeof(x), following S.

    o	New functions file.access() and file.info() for information on
	files on the user's file systems.

    o	New convenience function file.copy().

    o	file.show() allows `pager' argument to be an R function, and
	consequently, the `pager' option can be an R function.

    o	Formatting (and printing) of data.frames with complex objects is
	improved.  toString was added as a new function.

    o	format() has a new argument `justify' controlling the
	justification of character strings (and factors).

    o	Formula objects now have an environment and code manipulating
	them needs to take care to preserve it or set an appropriate
	environment.

    o	New function fourfoldplot() for producing fourfold displays of
	2 by 2 by k contingency tables.

    o	gc() now reports the space allocated, not the space free,
	since the total space is now variable.

    o	New primitive gc.time() to report on time spent in garbage
	collection.

    o	hclust() takes new argument `members' allowing dissimilarity
	matrices both for singletons (as until now) and clusters.

    o	help() has an additional `pager' argument which may be passed to
	file.show()  {useful for ESS fans}.

    o	There is now an R `Hershey' list object for Hershey vector font
	computations and documentation.

    o	hist() now returns a "histogram" object and calls the new
	function plot.histogram() for plotting.
	It now also allows character labels.

    o	if(*) now gives a more intelligible error message
	when "*" cannot be coerced to logical.

    o	inherits() is now an internal function and compatible with S.

    o	New function lag.plot() in package ts.

    o	legend() has a new argument pt.bg.

    o	The commands history can be loaded with loadhistory(), saved
	with savehistory() and displayed with history(), under Windows
	and under Unix using the readline or GNOME interfaces.

    o	mad() has new (logical) arguments "low" and "high" (the first
	giving S compatibility).

    o	New function manova() and summary method.

    o	Function mantelhaen.test() in package ctest now can deal with
	general I x J x K tables.  In addition, in the 2 x 2 x K case,
	it can also perform an exact conditional test of independence,
	and gives confidence intervals for the common odds ratio.

    o	model.frame() now uses the environment of its formula argument,
	rather than the parent environment, to evaluate variables not
	found in the data argument. See help(formula).

    o	mosaicplot() can now also create extended mosaic plots, which
	visualize the residuals from a log-linear model using color and
	outline.

    o	New utility function n2mfrow().

    o	nlm(check.analyticals = TRUE) now warns if the supplied
	gradient and/or hessian are of the wrong length.

    o	New function object.size() to give approximate memory allocation.

    o	optim() now checks the length of an analytical gradient at
	each evaluation.

    o	The L-BFGS-B method of optim() now support tracing, at several
	levels of detail.

    o	options(check.bounds = TRUE)  makes each vector extension
	by sub-assignment ("x[.] <- .") produce a warning.

    o	options(width) now admits to a limit (previously 200, now
	10000) and gives a more informative message if out of range
	(as it does now for digits and expressions).

    o	Function path.expand() to do tilde-expansion on file paths.
	This provides an interface to R_ExpandFileName, which is now
	a documented entry point.

    o	.Platform has new component "endian", useful for binary file
	manipulations.

    o	plot.function() and curve() now take xlim as default for (from,to)
	if the former is specified.

    o	plot.hclust() allows arguments main, sub, etc, and has non-empty
	defaults for these.

    o	plot.ts(x,y) now allows to suppress labels and lines;
	it is better documented.

    o	The postscript() driver now allows a user-specified family so,
	for example, one can use the same fonts in diagrams as in
	running text.

    o	The postscript() driver allows its prolog to be changed (by an
	expert) via object .ps.prolog.

    o	prop.table() and margin.table() now work with an empty `margin'.

    o	Formerly deprecated function provide() is now defunct.

    o	New functions read.delim() and read.delim2() to make it
	easier to read delimited files as Windows programs tend to
	create (usually TAB separated).

    o	New readLines() function to read a file line-by-line.

    o	New functions reshapeLong() and reshapeWide() emulating Stata's
	reshape command. These are still labeled experimental and
	might be improved (or removed) in later versions.

    o	row.names() and row.names<-() are now generic functions which
	call rownames() as their default method and have methods for
	class "data.frame".

    o	New function Rprof() for profiling R expressions under Unix.
	Configure with `--enable-R-profiling' (on by default) to make
	this operational.

    o	save(, oldstyle=TRUE) has been withdrawn.

    o	scan() and read.table() have a new argument `fill' which can
	be set TRUE to allow reading files with unequal number of
	fields per line. (Programs like Excel have a habit of creating
	such files when exporting.)

    o	scan() and read.table() have a new argument `blank.lines.skip'
	to allow blank lines to be read.

    o	scan() now reads empty character fields as "" not "NA" unless
	"" is included in na.strings.

    o	smooth() in package eda has a better default (3RS3R instead of
	3RSR) and more arguments, e.g. `twiceit' for some S
	compatibility and `kind = "3R"' for running medians of 3.

    o	strsplit() has a new argument `extended' controlling whether to
	use extended (the default) or basic regular expressions for
	splitting.

    o	Sys.getenv() becomes the preferred name for getenv(), which is
	now deprecated.

    o	New functions Sys.getlocale() and Sys.setlocale() to query and
	set aspects of the locale of the R process, and
	Sys.localeconv() to find the default decimal point, etc.

    o	New function Sys.info() for platform, host and user information.

    o	New function Sys.putenv() to set environment variables.

    o	New function Sys.sleep() to suspend execution for a while.

    o	Date-time support functions with classes "POSIXct" and
	"POSIXlt" to represent dates/times (resolution 1 second) in
	the POSIX formats.  Functions include Sys.time(), as.POSIXct(),
	strftime(), strptime(),	 and methods for format, plot, c, ....
	There are conversion functions for objects from packages
	`date' and `chron'; unlike those packages these support
	functions know about time zones (if the OS does).

    o	tcltk package now has tkpager() which is designed to be used
	by file.show() and shows help pages etc. in separate text
	widgets.

    o	tcltk is now more careful about removing the objects
	representing widgets in the R workspace when the windows are
	destroyed (e.g. using window manager controls)

    o	tcltk package has had several canvas functions implemented.

    o	tcltk now wraps callbacks to R in a try() construct - the
	nonlocal return from R's error handling could bring the Tk
	system into a strange state.

    o	New demos for tcltk: tkfaq, tkfilefind, tkcanvas.

    o	termplot() now has an `ask' argument.

    o	terms() creates objects which now inherit from class "formula",
	so for example as.formula(terms.object) needs to be replaced by
	formula(terms.object).

    o	traceback() is now printed un-quoted and labelled by the
	frame number.

    o	New argument `recursive' to unlink(). The default behaviour on
	Unix is now that of rm -f, not rm -rf.	unlink() is now
	compatible across platforms.

    o	New functions write.ftable() and read.ftable() for writing out
	and reading in flat contingency tables.

    o	write.table() now quotes factor columns if quote=TRUE, and has
	a new argument `qmethod' to control the escaping of
	embedded quotes in character or factor columns.

    o	New function xtabs() providing a formula interface to cross
	tabulation.


    o	The R Data Import/Export Manual (`R-data.texi') has been added.

    o	The set of valid R names is now described (at last) in R-intro.

    o	The R Language Manual (`R-lang.texi') is now included and built
	in the same way as the other manuals.

    o	The R manuals (R-intro, R-exts, ...) are converted to HTML
	format (if the necessary texinfo tools are available) and
	linked into the top HTML help page.

    o	The header file `R.h' and those included from it are now usable
	with C++ code.

    o	New header file `R_ext/Boolean.h': Rboolean type with TRUE and
	FALSE enum constants.

    o	New header file `Rgraphics.h' to allow addons to use graphics
	structures.

    o	Recommended include file `Rmath.h' replaces `R_ext/Mathlib.h'.

    o	Bessel, beta and gamma functions are now documented as part of
	the API.  Undocumented entry points are no longer in the
	header files, and some are no longer visible.

    o	Calloc & Realloc failures now give size information.

    o	DESCRIPTION file in installed packages has a new `Built:' field
	giving build information (R version, platform, date).

    o	Much improved support for C++ code in add-on packages under Unix.
	New configure/build variables SHLIB_CXXLD and SHLIB_CXXLDFLAGS
	for specifying the command and flags needed for building shared
	libraries containing objects from a C++ compiler.
	Configure tries to get these right in typical cases (GNU tools
	and/or common platforms).
	C++ source suffixes `.cpp' and `.C' are now recognized in
	addition to `.cc'.

    o	Configure/build variables MAINLD and MAINLDFLAGS are renamed to
	MAIN_LD and MAIN_LDFLAGS for consistency with other MAIN_* vars,
	similarly for SHLIBLD and SHLIBLDFLAGS.

    o	Configure/build variable FLIBS now only contains the Fortran 77
	intrinsic and run-time libraries needed for linking a Fortran 77
	program or shared library (as determined by configure).	 BLAS
	library detection was extended, with results saved to the Make
	variable BLAS_LIBS which is also available to add-on packages.

    o	R CMD build and check have been completely re-written in Perl.
	In addition to running examples, check now also checks the
	directory structure and control files, makes a temporary
	installation and runs LaTeX on the help pages.	Build has been
	reduced to cleaning, rewriting indices and creating tar files.

	The same files of Perl code are now also used under Windows.

    o	Add-ons for utilities like Perl or LaTeX have now a central
	place in $R_HOME/share. Migration of existing files might take
	a while, though.

    o	Preliminary support for building R as a shared library (`libR')
	under Unix.  Use configure with option `--enable-R-shlib' or do
	`make libR' in directory `src/main' to create the shared
	library.

	There is also a linker front-end `R CMD LINK' which is useful
	for creating executable programs linked against the R shared
	library.


BUG FIXES

    o	New "[.AsIs" function fixing PR#665.

    o	Effectively zero-length arrows() are omitted (rather than getting
	a system- and device-dependent arbitrary angle).

    o	barplot() passes "..." down to plot.window as documented.

    o	bxp(*) now obeys axes, xaxt, yaxt & ylim arguments (again?).

    o	contour(.., labcex = 0.6, .. , vfont = c("sans serif", "plain"), ..)
	now behaves as it has been documented, PR#740.

    o	D(.) is now more correctly documented, has second argument
	"name" instead of "namevec" (S compatibility), and gives a warning
	when name has not length 1.

    o	dbinom() and dpois() now use a the accurate algorithm of C.Loader;
	e.g., 1 - 2*sum(dbinom(0:999, 1999, 1/2)) is now zero instead of 1e-12.

    o	dbeta(), df(), dt(), dnbinom(), dgeom(), dgamma(),
	now all use the more accurate algorithms of dbinom() and dpois();
	More limits are computed correctly, e.g. dgeom(Inf,*), or
	dnbinom(*,*,p=0), and integer argument coercion is more consistent.

    o	dbeta(x, a,b) was giving NaN and Inf for large a and b.

    o	The math functions now (again!) return NaN (not NA)
	when the warning message says so (e.g. gamma(-1)).

    o	Paper sizes for "a4" and "legal" were interchanged in dev.print().

    o	Improved logic in the re-scaling of plots in dev.print().

    o	dev.print() and dev.copy2eps() now evaluate arguments as
	needed, so e.g. dev.print(file="junk.ps", horizontal=F) will
	work (previously =FALSE was needed).

    o	Now dweibull(0,1) == dexp(0) == 1 for consistency.

    o	Changing column modes from factor/character to numeric in
	edit.data.frame() (and fix() on data frames) is now allowed.

    o	gctorture() did return a value although documented not to, that of
	gcinfo.	 It now returns the previous setting of gctorture.

    o	glm() now follows lm() in dropping unused factor levels when fitting.

    o	hist() now labels y-axis Density rather than Relative Frequency
	if freq=FALSE. The `intensities' component of the result is
	now deprecated and `density' should be used instead.

    o	hsv() truncation bug fixed (hopefully correctly this time...)

    o	library.dynam() no longer fails if the library appears more than
	once in lib.loc.

    o	lm.fit & lm.wfit (and hence lm) now give understandable error
	messages when there are 0 non-NA cases.

    o	match() does not always use "as.character()" anymore, fixes PR#741.

    o	Trimmed mean() and median() are no longer attempted for complex
	data.

    o	median() of empty vector is now NA.

    o	model.matrix() can now handle NAs in factors.

    o	model.matrix() now uses ":" not "." in labelling interaction
	terms, as terms() and the prototype do (PR#701).

    o	old.packages() now sorts version strings correctly by
	splitting at "." and "-".

    o	optim() has several new precautions against bugs, one of which was
	an infinite loop in the L-BFGS-B method if the derivatives
	were inaccurate (or if numerical derivatives were used and the
	problem was badly scaled).

    o	pairs() now obeys an "cex = " argument, and so does panel.smooth().

    o	pf() had a bug in the code handling large noncentrality
	parameters, going all the way back to the original Appl.Stat.
	algorithm (PR#752). This affected pbeta() as well.

    o	phantom(expr) in plotmath was used to calculate the bounding
	boxes, but the space was not actually used in typesetting the
	expression (PR#622).

    o	Problem with subsetting and "..." arguments in plot.formula()
	(PR#757)

    o	plot.lm() has a better default for its `ask' argument.

    o	plot.new() does *NOT* allow an argument (`ask') anymore.
	This has not been working (since ~ R 0.49), is low-level and
	hence should not break anything.

    o	plot.stl() now uses correct time labels for tickmarks of x-axes.

    o	pnorm() is somewhat more accurate (SIXTEN=16; PR#699) and
	`infinitesimally faster' in some cases, thanks to James M. Rath.

    o	Failure to open a postscript() device now gives diagnostic warnings.

    o	Zero the widths of undefined chars in postscript().

    o	Make font metrics local to the device in postscript(), so
	that simultaneous instances of postscript/xfig/bitmap can use
	different values for `family'.

    o	postscript() no longer uses the initclip operator, which
	was against the EPSF specifications and broke inclusion of
	graphics in some documents.

    o	In postscript(), cleaned up the internals to fix some
	cases where it was unclear whether a variable was meant to set
	or track device status.

    o	In some cases, emitted postscript violated the PS Document
	Structuring Conventions since some settings were carried over from
	one page to the next. (Caused breakage when turning
	antialiasing on/off in "gv" for instance.)

    o	The DocumentMedia comment in postscript() output was wrong,
	and the font DSC comments have been changed to the preferred
	style for DSC 3.0.

    o	pretty(x <- c(2.8,3))[1] - x[1] is now 0; in general,
	p <- pretty(x) now again fulfills  p[1] <= x[] <= p[length(p)].

    o	print.dist() {mva} now passes "..." to print.default.

    o	print.noquote("ABC") now works.

    o	prompt(fn) uses fn's "source" attribute if it has one.

    o	In prop.test(), the conf.int. now contains the estimate,
	even when that is 0 or 1 (PR#714).

    o	qnorm(0) and qnorm(1) now give -/+ Inf (again!).

    o	qt(*, log = TRUE) has a somewhat extended working range.

    o	Specifying col.names in read.table() now overrides any header
	line in the data file.

    o	Bug caused rpois() to generate biased variables in some cases.

    o	scale(scale=TRUE) gave all NAs in any columns containing NAs.

    o	eda's smooth() now computes Tukey's endrule properly.

    o	smooth.spline()'s GCV method now uses a more accurate formula
	when there are repeated x points.

    o	stars() fix (for 0/NA columns) PR#739.

    o	data(state)'s  state.abb  has been corrected to use official
	2-letter abbrevations.

    o	strsplit() had two memory leaks.

    o	tcltk interface now has better string quoting and no longer breaks on
	strings with unbalanced braces

    o	tcltk callbacks used to include a "%..." argument on the call if the
	callback function had a "..." argument. This is no longer the case.

    o	t.test() allows an input vector of length 2.

    o	Method dispatch in primitive functions such as `c' only
	occurred if they were called by that name, and in particular
	not if used in lapply or called as .Primitive("c").  It now
	always occurs.

    o	Method dispatching now forces evaluation of promises, so
	autoloading works with methods.

    o	c(0.099999994, 0.2) prints as 0.1 0.2 not 0.10 0.20 after
	correcting the precision calculations.

    o	Internal function fprec was overflowing for numbers around
	1e-305.

    o	[internal] .C("strsignif",*) doesn't use fixed size strings anymore
	(possible overflow).

    o	ff[i] <- r  now works for formula (and potentially other
	non-standard) objects ff.

    o	Errors in argument matching could cause crashes if error
	handler was used.

    o	NULL == ... now gives logical(0) instead of an error.
	This fixes a bug with e.g. apply(X,2,median, na.rm = TRUE) and
	all(NULL == NULL) is now TRUE.

    o	polylines with more than 64K pieces will now work on more X
	servers with the x11 device.

    o	R CMD Rd2dvi now again works with file names containing "_" or "$".

    o	R CMD Rdconv now handles .rd as input file extension correctly
	in all cases.

    o	make install could fail if there were no shared libraries to
	install (e.g. on vanilla Solaris).

    o	Rd's \describe{} constructs are converted better to text
	output, and \items of >=22 chars now work.

    o	Help aliases "(" and "{" now work, apart from as PDF hyperlinks.

    o	NA || x , NA && y (etc) do not give errors anymore, but work as
	the "|" and "&" operators and as documented (PR#749).

    o	Coercing lists to functions failed if argument list was empty.
	(PR#743). Also coercing functions to lists was wrong when the
	body was a single constant.


	**************************************************
	*						 *
	*	       1.1 SERIES NEWS			 *
	*						 *
	**************************************************


		CHANGES IN R VERSION 1.1.1


NEW FEATURES

    o	data(), example() and help() now search the loaded packages, then
	in their .lib.loc argument, the latter as pre-0.99.0.  See
	their help pages for the precise details.

    o	help() has a new argument `try.all.packages' set by the option
	"help.try.all.packages". If help is not found in the normal
	path and this is TRUE then a search is made of all packages
	for possible matches.

    o	Improved detection of Tcl/Tk at configure time.	 One can either
	set configure variables TCLTK_CPPFLAGS and TCLTK_LIBS, or give
	the locations of the tclConfig.sh and tkConfig.sh scripts via
	the `--with-tcl-config' and `--with-tk-config' arguments.

    o	prop.trend.test() - test for trend in proportions.

    o	write.table() has new argument `dec' for setting the decimal
	separator (SPSS/Windows and probably others want commas in
	continental European locales).

    o	Advance warning: save(, oldstyle=TRUE) will no longer be
	available after this release.

    o	Symbols can now be coerced to expressions, making
	as.expression(quote(a)) work


BUG FIXES

    o	data() now works correctly with data-only packages.

    o	Standalone Mathlib can now be made if builddir = srcdir
	(working around an undocumented autoconf `feature').

    o	Check for pre-1.1.0 saved object .Postscript.options in postscript().

    o	More stringent checks on the arguments to dataentry().

    o	Specifying xlab as an expression now works again.

    o	dev2bitmap() works again.

    o	Numerous uses of `F' and `T' replaced by `FALSE' and `TRUE'.

    o	bxp() now extends `ylim' properly when notch=TRUE (and a
	notch is more extreme than other stats).
	Also, varwidth is okay again, see example(split).

    o	Making manuals without making R first now works.

    o	princomp() now works when some eigenvalues are tiny negative
	values (which are treated as zero).

    o	SearchEngine.html was not installed when builddir != srcdir.

    o	lm.{w}fit(x,y,..) now work when x has no column names.
	These functions no longer add and subtract n zeros when there's no
	offset.	 They are now documented somewhat.

    o	Some HTML files used src="R.css" instead of href="R.css" causing
	some browsers to ignore the style sheet.  `R.css' now passes the
	w3c CSS validator and gives the intended results with Internet
	Explorer.  `R.css' is copied to all library directories.

    o	The data editor no longer crashes when entries contain more than
	45 characters, and works correctly if the field width is
	larger than the window width.

    o	Recording plots used to ignore graphics events before the last
	replay.

    o	plot(), points(), etc now give warnings and error for invalid
	`type' arguments.

    o	matplot() now allows the same `type's as plot().

    o	dev.print() and dev.copy2eps() now work when called from a
	function, such as dev2bitmap().

    o	anova.glmlist works correctly with decreasing models and
	test="F" now gets the correct residual df.

    o	Functions created (not just edited) with fix() now get
	environment .GlobalEnv not the body of fix.

    o	Rdconv was ignoring OS-specific parts of the files with some
	Perl versions. (This did not affect installing packages.)

    o	R CMD check  did not run more than one specific test.

    o	keyword2html omitted items when changing up a level, so
	the HTML search engine keyword list was missing `data' and
	`utilities', for example.

    o	aov() with multiple strata was setting some spurious options.

    o	Under UNIX, help(, htmlhelp=TRUE) uses the linked copy of the
	HTML file in ~/.R if help.start() has been run recently in the
	session, so the style sheet and hyperlinks should now be found.

    o	dotplot's arguments `color' and `lcolor' are now interpreted
	correctly if they are vectors of length > 1.  (It is not clear
	from the help that this was ever intended.)

    o	Error messages of e.g. do.call() are now spaced properly.

    o	summary(.matrix | .data.frame) now respects a `digits' argument.

    o	scan() recognises quoted strings by default again. The default
	for the quote= argument got set wrongly when it was
	introduced. They are, however, turned off when using sep="\n",
	since you probably want unprocessed lines of text in that
	case.

    o	fixed buglet where scan() would double a character following a
	terminating quote symbol.

    o	kmeans was failing on vector inputs (although not documented
	to accept such).

    o	fixes in predict.lm (John Maindonald)

    o	NCOL got confused by 1D arrays, which it now reports have 1
	column rather than NA.

    o	rep(1:2,c(1,-1)) segfaulted (PR 619)

    o	x[["a"]] <- y rejected some object types for y (e.g.
	expressions) which were accepted in x$a <- y (PR

    o	data editor froze on empty data frame, and more generally on
	zero-length cols.

    o	data editor did not handle factors properly in numeric-edit
	mode.

    o	table() misbehaved on empty (or all-NA) data

    o	data editor now handles empty data frames, allowing data entry
	to begin with  dd<-edit(data.frame())  or
	dd<-data.frame() ; fix(dd)

    o	plotting math expressions when specified as a LANGSXP or
	SYMSXP didn't work in several cases: plot(1,main=quote(a))
	would segfault and there were problems with title(), text(),
	and mtext() as well.

    o	optim(): no more segfault for REPORT=0; corrected error msg; ..
	maxit default is now okay also when "L-*-B" is chosen automatically.
	Using (abs|rel)tol with that method now gives a warning.

    o	text() did not respect its `xpd' argument, the default of which
	is still to use par("xpd"); gave a wrong error message in one case.

    o	polygon() had an incorrect documentation and silently disregarded
	"..." arguments.

    o	predict.loess was giving incorrect results (those for the
	non-robust fit) in the case of a fit with family = "symmetric"
	and surface = "direct" and prediction with se = FALSE.	The
	fitted values were missing for such fits.

    o	Better rendering of ^ and ~ in latex in \code{} (and they should
	not appear outside code and verbatim sections).

    o	Fixed unterminated string problem with lty (PR 584)

    o	Fixed scoping problem with quasi() family (PR 614)


		CHANGES IN R VERSION 1.1.0


NEW FEATURES


    o	There are several changes to the compile and link flags, and
	an attempt is made to use /usr/local/include and
	/usr/local/lib on all platforms.  Please read config.site and
	INSTALL if you have set flags for previous versions.

    o	New package tcltk, providing interface and language bindings for
	the Tcl/Tk graphical interface toolkit. This makes it possible
	to do some rather nifty things with buttons and entry fields
	and so forth in very few lines of code.	 It is still somewhat
	experimental so don't go churning out thousands of lines of
	GUI code and then blame us for changing the API later on. It does
	not currently work with GNOME because of event loop differences.
	See demo(tkttest) and demo(tkdensity).

    o	Internally using global R_Expressions [getOption("expressions")]
	dramatically speeds up eval.c.

    o	The X11 support code is now in a separate shared library, and
	option `--gui=none' will run R without X11 support (and so x11()
	and data.entry() will not be available).  R BATCH sets --gui=none.

    o	Configuring without X (e.g., `--without-x') does work (at last).
	configure will report if X11 support has been included.
	If R has been built without X11 the default GUI is "none".

    o	GNOME support files have moved from src/gnome to src/unix/gnome
	and the code is now in a separate shared library.  Both
	`--gui=GNOME' and `--gui=gnome' are allowed.

	The main graphics device for use with GNOME is now called
	gtk(); the x11() device from the X11 support can also be used.
	(The gnome() device remains unreliable, and is by default
	unavailable.)

	All GNOME support now installs in R_HOME/gnome to make it
	easier to package separately.

    o	Command line option `-g' can now be used as short version of
	`--gui'.

    o	The "keep.source" option now defaults to interactive()
	instead of TRUE.

    o	Many interface enhancements to the data editor, which now uses
	(by default) variable-width columns and much less redrawing.
	See ?dataentry for a description of the current user interface.

    o	R under Unix can be sent SIGUSR1 to quit and save or SIGUSR2
	to quit and save without running .Last and on.exit
	expressions.

    o	Added ability to use the graphics device driver to perform
	horizontal justification of strings.  This is used in the
	x11(), windows(), postscript() and xfig() drivers and will
	lead to more accurate placing of centred or right-justified
	strings.

    o	Formulas created with the tilde operator now contain the
	environment in which they were created.	 The environment of a
	formula can be accessed with the environment() function.  This
	facility is still experimental; it is intended to help
	simplify writing modeling functions.


    o	$ and $<- are now generic functions.

    o	add1.glm() and drop1.glm() now allow test="F", which is
	appropriate for models with estimated dispersion.

    o	approx() and approxfun() have an extra argument ties= to control
	handling of tied x values

    o	New function as.symbol(), identical to as.name().
	is.symbol and is.name() are now identical by definition;
	before, they were equivalent by implementation.

    o	attach() now works for R data files.

    o	axis() now has additional arguments.  The argument "tick" turns
	tick drawing on and off (on by default).  Additional arguments
	line, pos, and outer; allow more flexible placement of axes.

    o	New device bitmap(), like dev2bitmap() but a stand-alone device.

    o	boxplot() returns (and bxp() accepts) a list containing the summary
	statistics for the boxes (changed from a list of elements one for
	each box).

    o	file="|cmd" is allowed (to pipe output to `cmd'), under cat()
	and postscript() and functions that use them (for example, write()).

    o	New functions chartr() for general-purpose character translation
	in character vectors, and tolower() and toupper() for converting
	alphabetic characters to lower-case and upper-case, respectively.

    o	coplot() has new option subscripts=TRUE to pass the indices
	to the panel function.

    o	cor.test(method="spearman") might give slightly better P values,
	since it now relies on pnorm() (with proper tail) instead of alnorm.

    o	dbinom() works for size=0 (where appropriate).

    o	New trivial function det() for determinant computation
	(the example in ?qr did not seem to be sufficient).

    o	If present in the package, a function .Last.lib will be called
	when a package is detached.

    o	New function dev.copy2eps() copies the current device to an eps
	file, taking the size from that of the device.

    o	dev.print() now prints if possible, and takes the size from
	the device being copied.

    o	edit() or fix() applied to a numeric or character matrix now
	uses the data editor, if available.

    o	edit.data.frame() edits factors in character mode by default,
	and will allow the row names to be edited, by default if they
	are not 1:nrow(name).

    o	expand.model.frame() for adding variables to a model frame.

    o	The handling of estimating the dispersion in glm() fits has been
	changed for consistency across methods.	 For `binomial' and
	`poisson' families the dispersion is always taken as one.
	For `quasibinomial' and `quasipoisson' families it is always
	estimated (by residual chisq/residual df).

    o	Using "~" when specifying lib.loc (for example to help() or
	library()) is now supported.

    o	image() has a new argument "breaks" and divides the zlim range
	into equal-length intervals.

    o	install.packages() and update.packages() have a new `destdir'
	argument for the directory to which to download the packages.

    o	New function interaction.plot().

    o	Internal cleanup of lapply()'s C code.

    o	library(), require(), and sys.source() have a new argument
	` keep.source = getOption("keep.source.pkgs") '.
	This defaults to false, but can be set (also for base) to true
	by setting the environment variable R_KEEP_PKG_SOURCE to "yes"

    o	Par `lty' in lines() now defaults to par("lty") not "solid",
	for consistency with plot().

    o	list.files() [aka dir()]: path argument has now default = "."

    o	locator() allows inline graphics parameters (for the plotting
	it does with type !="n").

    o	New function max.col() from MASS, thanks to V&R.

    o	nlm() can now take additional arguments in ... to be passed to f.

    o	par() returns elements in alphabetical order, and "ann" as a
	logical (not integer).

    o	.Platform has a new component GUI specifying the GUI in use
	(which might be "unknown").

    o	plot.formula() searches for a plot method for the left-side of the
	formula before searching for a plot method for the right-side of
	the formula.

    o	New bitmap devices png() and jpeg() on Unix/X11. (They were
	already available on Windows.)

    o	postscript(print.it=TRUE) now does print the plot file.
	postscript(onefile=FALSE) now produces multiple separate files.

    o	provide() is now deprecated.

    o	New function quade.test() in package ctest for the Quade test
	for unreplicated blocked data.

    o	quantile(x, probs) now propagates NA/NaN in probs.

    o	Option for user-supplied normal random generator in RNGkind().

    o	read.fwf() is no longer dependent on Perl.

    o	New arguments check.names and strip.white to read.table() and
	friends.

    o	Functions recordPlot() and replayPlot() save a plot to an R
	variable and replay it.

    o	residuals.lm() also allows types "partial" and "response"
	as residuals.glm().

    o	Added col option to rug().

    o	scale() is now generic with scale.default method.

    o	New "call. = TRUE" argument for stop(), and
	new function  stopifnot(.) -- to be used in "make check".

    o	str(.) has a new optional argument "nchar.max = 128" and truncates
	strings longer than that.  Also eliminated a few minor glitches.

    o	The symbols() function is now implemented.

    o	New function termplot() with similar functionality to
	plot.gam() in S.

    o	The parameters to title() which specify the labels may now
	be specified as a list containing the parameter together
	with additional modifying par values (cex, col, font) which
	affect just that label.

	title() also has new line and outer arguments which provide
	functionality which matches that in axis().

    o	New functions which.min() amd which.max().

    o	The Wilcoxon and Ansari-Bradley tests now optionally return
	confidence intervals for the location or scale parameter of
	interest.

    o	New argument `extend' to window() (and updated documentation).

    o	write.table() can now write CSV files in the format Excel expects.

    o	New device xfig() to produce XFig files.

    o	New xyz.coords() utility function to be used for 3D highlevel plots.


    o	R CMD build now also works for package bundles.

    o	Rdconv allows an output file to be specified.

    o	Initial support for C++ source code in add-on packages under Unix.

    o	Mathlib can be built as a standalone library: see directory
	src/nmath/standalone.

    o	The trace() function has two new features.  Giving where= as a
	function name allows tracing of functions called from a
	namespace.  A new argument edit= allows inserting arbitrary
	tracing code in the function.  See the online help for
	details.

    o	Namespaces and S4 classes/methods should work better
	together.  Generic function and class definition objects are
	used in many places where the name of the function or class
	was used before, which caused problems for non-exported objects.


BUG FIXES

    o	The Mathlib functions now use exactly the same values for
	+/-Inf, NaN and NA as the rest of R in all cases.

    o	Improved automatic remaking.


    o	option keep.source was not set correctly before the base
	package was loaded: some functions in the base package had
	the source kept.  The memory usage should now be reduced by ca 1Mb.

    o	The base file is no longer closed twice in case of a syntax
	error (caused segfault on Linux).

    o	The X11 data editor scrolls cells and so allows more than ca 10
	characters to be entered.  Several interface/redraw errors
	have been corrected.

    o	Using `destroy' or `close' on the X11 data editor window killed R.

    o	Multiple `destroy' events or X11 errors killed R (PR#400).

    o	Warnings from .Last or closing devices are printed where
	sensible (e.g. not on GNOME nor Windows console).

    o	add1.glm() and drop1.glm() gave incorrect results in the "Chisq"
	test option when the scale was estimated.

    o	aggregate() applied to multiple time series lost the series names.

    o	as.hclust.twins() in package mva sets method=NA (PR#538)

    o	ave(1:3) now works (as when is.null(list()) was TRUE years ago).

    o	barplot(c(0.1, 0.5, 1), ylim = c(0, 1)) now works: [xy]axs="i"
	and exact limits now labels the limits.

    o	by() works when embedded in a function.

    o	The xlab and ylab in coplot() now set the x and y axis labels,
	as in S.  Supply a second component to label the conditioning
	variables.

    o	count.fields() and read.table() now have the same default
	quote = "\"'".

    o	guard against segfault in dataentry(x<-1, Modes = plot), and the like.

    o	dev.print() now checks if the current device is replayable
	(and not all devices were, despite the documentation).

    o	The gtk() device (formerly x11() under GNOME) was incorrectly
	returning character information, so in particular `*' was
	wrongly centred as a plotting symbol.

    o	is.qr() checks not only for $qr, but also for $rank & $qraux, PR#482.

    o	library() will not leave the package on the search path if
	loading fails (including if .First.lib fails).

    o	lqs(, method="S") rounded k0 on passing to C.

    o	na.omit() now handles vectors and matrices as well as data
	frames.

    o	plot.lm(*, which=4) now works thanks to Marcel Wolbers.

    o	postscript() now uses the options "papersize" and "printcmd"
	rather than the values of R_PAPERSIZE in the environment
	and R_PRINTCMD found at build time.

    o	postscript() now makes use of kerning information in computing
	string widths.

    o	M <- 2 ; print(ppr(.., nterms = M))  now works.

    o	ppr(, sm.method="spline") had an internal limit of 250 rows:
	this is now 2500 and is now checked.

    o	predict.lm(,type="terms",se.fit=T) gives correct standard errors
	(thanks to John Maindonald)

    o	print.ftable() now returns its argument.

    o	proj.aovlist() now gives a non-zero result for strata with
	no fitted effects.

    o	qnorm() is now based on AS 241 instead of AS 111, and should
	give precise results up to 16 digits precision.

    o	rgeom(, prob=1) gives 0 rather than NA

    o	rpois(*, lambda) now works when lambda > .Machine$integer.max

    o	strheight("X") with no active device would segfault.

    o	system() is now (partially) functional on systems without popen.

    o	Fixed bug in undoc() - requiring new `chdir' argument
	for sys.source()

    o	Fixed problem in usemethod() where CAR(call) could be non-symbol.

    o	The x11() device no longer crashes R if a font is not found,
	and will warn if there is a size mismatch of more than 10%.


    o	R CMD Rd2dvi now sorts files alphabetically.

    o	Rdconv now reports if an invalid type is specified (rather
	than using latex).

    o	Support for Rd conversion to Sd has been reinstated (it was
	unintentionally removed along with nroff-based conversion to text).

    o	\deqn{} fix in R-exts.texi, PR#523.


    o	Linpack.h now makes clear which routines are actually in R.

    o	Entry-point "pythag" is now loaded even though it is not
	necessarily used in R.	Where "hypot" is available pythag
	just calls hypot after checking for special values.

    o	call_R will now correctly handle character vector arguments.

    o	The alphabet links on top of HTML function indices with more than
	100 entries now contain only the letters which are really
	first letters of at least one entry.



		CHANGES IN R VERSION 1.0.1


BUG FIXES

    o	pgamma(Inf, 1, Inf) gives NaN instead of an infinite loop, PR#462.

    o	Inline xaxt and yaxt parameters were ignored.

    o	Setting the normal RNG was not always recorded in .Random.seed.

    o	\link[pkg]{foo} links were wrongly translated to HTML.

    o	Direct use of show.data() with no args was incorrect.

    o	print.coefmat does sensible things if options
	show.signif.stars and show.coef.Pvalues are not set correctly.

    o	x <- list(a=1, b=2) ; x["c"] <- 3 now (again) stretches the list
	rather than give a "subscript out of bounds" error.

    o	Models with response appearing on rhs could cause segfault.

    o	as.data.frame.matrix will now ensure the columns added have
	non-empty names.

    o	Some (strange?) model formulas could cause memory corruption
	(thanks to John Fox for digging this up).

    o	Matrix multiplication in cases such as 1:3 %*% t(1:2) is accepted.

    o	Options --nsize and --vsize to R CMD check gave warning
	messages and only one was accepted.

    o	The autoload()s during startup are "wrapped" such
	that conflicting objects don't break startup.

    o	cor.test(*, meth="spear") {pkg ctest} now works (again) for n <= 6

    o	scale = 0 in biplot.princomp() now works.

    o	The scores given by princomp(, cor = TRUE) and the rotated
	values given by prcomp(, scale = TRUE) are now computed from the
	scaled data.

    o	barplot now works okay when length(col) < length(legend.txt),
	thanks to Ben Bolker, PR#494.

    o	legend has new args `ncol' and `horiz' thanks to Ben Bolker.

    o	kernel("dirichlet", m=10, r=1) in package ts now works.

    o	save/restore of	 environments containing "..." object should
	work now.

    o	qhyper should work better for large N.

    o	qbinom(1-1e-16, n, p) , qpois() and qnbinom(*) looped for ever.

    o	as.matrix.data.frame no longer escapes quotes in character
	vectors.

    o	R would try to save the readline history at the end of
	non-interactive sessions, causing crashes on some systems.

    o	Subtle roundoff problems caused arrays to be allocated short in
	loess.c in some cases, leading to segfaults.

    o	Document that postscript(file="") sends the output directly to
	the default printer.

    o	ts.union(, dframe=TRUE) had a long-standing typo, now works.

    o	save(, ascii=TRUE) had problem with octal escapes in strings
	when there was a digit following, should work now.

    o	matpoints() and matlines() now also have a "type =" argument
	with defaults "p" and "l", respectively; PR#506.

    o	The new Perl 5.6 broke our version-detection mechanism. A
	better one has been inserted.

    o	X11(colortype="gray") failed to work on 8-bit screens, and
	more generally when colour allocation failed X11() did not
	revert to monochrome correctly (and did not say it was doing so).

	It was not documented in the help that to change the X11
	colortype one needs to close all open X11 devices.

    o	loessf.f in modreg defined DSIGN unecessarily and this caused
	a conflict on AIX.

    o	plot.lm will now work with rlm objects.

    o	start and end behave better when the frequency is not an integer.

    o	aggregate.ts is closer to S-PLUS's aggregate.rts.

    o	quantile(x) now works when x contains several +/- Inf's.

    o	guard against segfault in dataentry(0,0) (or, more
	realistically, when mistyping data.entry(x,y) as
	dataentry(x,y))

    o	fixed special cases that caused bad behavior for methods,
	particularly with nested use of primitive operators when
	setMethod had been called.  Also fixed some situations that
	prevented caching methods (and therfore slowed down dispatch
	seriously) in similar cases.

    o	Packages can now have non-exported classes.  Previously this
	failed because computations could not find methods for objects
	from private classes.  Adding a "package" attribute to an
	object's class attribute (along with a large number of changes
	to use the package information) fixes this for most cases.
	(Methods for primitive functions still use global information
	about classes because of imposed efficiency constraints on
	primitives.)

    o	untrace() now works with package::function-style references.


	**************************************************
	*						 *
	*	       1.0 SERIES NEWS			 *
	*						 *
	**************************************************


		CHANGES IN R VERSION 1.0.0


NEW FEATURES

    o	The entry points [dpq]norm no longer exist: the header file
	R_ext/Mathlib.h must be used and such code re-compiled.

    o	Header files in R_ext must be given explicitly as e.g.
	"R_ext/Mathlib.h".

    o	New function  log1p(x) := log(1 + x) , accurate for |x| << 1.

    o	HTML searches can now select between any combination of
	titles, keywords and object names. The keyword list of
	SearchEngine.html is automatically built from KEYWORDS.db.
	Missing links are now resolved using the search engine.

    o	A data subdirectory of the working directory will be
	searched for data, by default after all the loaded packages
	(including base).

    o	Data directories can now be zipped as Rdata.zip, provided a
	list of contents is provided in file `filelist'.

    o	New function try(expr) which provides a user-friendly wrapper
	to restart().

    o	New function geterrmessage() to retrieve the last error
	message, for use in try() and user's error handlers, and new
	option "show.error.messages" to control the printing of error
	messages.

    o	persp() now labels its axes.

    o	?plotmath documents the plotting expressions facility much
	more comprehensively, with tables in the examples.

    o	New functions dump.frames() and debugger() allow post-mortem
	debugging.  See the help on debugger.

    o	New functions by() and merge() to split and join data frames.

    o	Generic methods now do "match before dispatch", so
	plot(pch=2, y ~ x) invokes plot.formula.  Notice that this will
	break user code if it has renamed the dispatch argument and
	uses the original name for a different argument.

    o	Long-named command-line options also allow `--name VALUE'.

    o	arima0() now uses optim() rather than nlm(), and is thereby
	normally faster and gives more accurate solutions.  Perhaps
	more importantly, it fails to converge much less often.

    o	Enhanced pairs() function allowing separate upper, lower and
	diagonal panel functions and control of diagonal labels.
	(Much of this was contributed by Jens Oehlschlaegel-Akiyoshi.)

    o	Links to R objects in other packages in help files can now be
	specified explicitly as \link[pkg]{topic} or
	\link[pkg:maintopic]{topic}

    o	optim() has a new simulated annealing method contributed by
	Adrian Trapletti.

    o	Hershey vector fonts are available in text() and contour().
	Documentation for Hershey vector fonts is in help(Hershey).

    o	The HTML function indices (for packages and for all installed
	functions) and the index to the reference manual now omit
	methods for generic functions if they would immediately follow
	the generic and refer to the same file. This reduces the
	clutter considerably.

    o	New functions points.formula() and lines.formula() to supplement
	plot.formula(). The latter has been enhanced so that all
	arguments are now evaluated in the supplied data frame and all
	subsettable arguments are subsetted. Notice that the data=
	argument can no longer be given as a positional argument but
	must be given in keyword form.

    o	The behaviour of pmatch() has been changed to be S-compatible:
	in particular the meaning of duplicates.ok=TRUE has changed.
	The help for pmatch and charmatch now gives more precise
	descriptions, including of their differences.

    o	print.hclust(), hclust() and dist() now store the method
	that has been used.

    o	If there are unmatched function argument(s), the first found
	is named in the message, for example
	`unused argument(s) (xlabel ...)'.

    o	Conversion from Rd to raw nroff is no longer available.

    o	text() now accepts vector "col", "cex" and "font" arguments.

    o	"default" is now a valid argument to RNGkind().

    o	nlm() and optim() will now give up immediately they try to
	step to a non-finite value: nlm at least would go into an
	infinite loop.

    o	"mostattributes(obj) <- value" utility useful for careful
	attributes' inheritance; e.g. for fixing pmax/pmin (see below).


BUG FIXES

    o	(0.99.0a) The internal code for strsplit no longer destroys
	other internal structures, e.g. postscript file output on
	Linux.

    o	(0.99.0a) nlm() no longer segfaults with Hessian specified.

    o	(0.99.0a) Gnome version plotmath works, kind of

    o	(0.99.0a) edit.data.frame() now handles character vectors
	better, provided they were generated with I().

    o	(0.99.0a) Attempt to special-case print-buffer allocation
	with just a format argument was abandoned, since there is
	no portable way of doing it and it caused compile problem
	on Alpha.

    o	tempfile("") now works on all Unix platforms, and
	tempfile("a b c") returns a single name (with spaces in).
	The file names are now unique across processes (Unix), are
	guaranteed not to exist and very likely to be unique within
	an R session.

    o	The search semantics of data(), example() and help() have changed
	(see their help pages). In particular, they will normally
	look in the package which was loaded, even if it is not in
	one of the libraries given in .lib.loc.	 Autoloads are no
	longer included in the search (as they searched whole packages,
	not just the autoloaded objects).

    o	The documentation for .Rd files said & must be entered as \&
	but only the unescaped form was processed correctly. Now both
	are accepted but & is preferred.

    o	list.files now skips non-existent/unreadable directories with
	a warning, rather that failing with an error.

    o	Lots of help examples now tidy up the files they created, and
	detach data frames and libraries they attach.

    o	library(help=foo) lists only contents of first version if
	multiple matches are found on lib.loc.

    o	round(2.345e-99, 100) now works (not giving 0).
	C functions fprec() and fround() [= R's signif() and round()],
	now use R_pow_di(10.0, n) which is clean and more efficient.
	This changes some results in the least significant bits.

    o	rpois sometimes had problems with mu=0, now special-cased

    o	Rare memory overrun in rpois fixed.

    o	--nsize and --vsize arguments to R CMD check now work.

    o	plot.stepfun had renamed the dispatch argument and used the
	original name "x" for a different argument which broke on the
	new `match & dispatch' code. Changed to "xval".

    o	The return value for par() was incorrectly documented, and in
	consequence cpgram() was not re-setting "pty".

    o	package.dependencies() printed unnecessary debugging messages
	(version comparison): these have been removed.

    o	backslashes in examples in help files are now converted
	correctly to latex.

    o	qchisq with non-centrality parameter now does something.

    o	Greek symbols are now converted correctly in HTML help (but
	only rendered correctly on a few browsers).

    o	rbind(x, y) works when x has no columns.

    o	\tabular in Rd files is rendered better in latex, and long
	tabular material is now acceptable (and split over pages).

    o	evaluation depth wasn't properly reset by  "next"

    o	Old (pre-0.63.1) .Random.seed would cause problems if used.

    o	Row indexing of data.frames by characters (e.g. y["ab", ])
	was wrong, as pmatch was not S-compatible.

    o	Contour labels used to be rounded to integers.

    o	Calling rbinom() repeatedly with the same p but different n
	gave incorrect results.

    o	Rd2contents assumed the \name field was the file name, so
	searches could lead to non-existent links.

    o	Assigning functions to list elements is not longer disallowed.

    o	Unified usage statement to R CMD xxx for all commands

    o	Using duplicated new string indices in [<- caused a crash on
	some platforms, e.g. x <- 1:2; x[c("3", "3")] <- 3; x.

    o	rle() can now handle character vectors, as documented.

    o	print.default failed to reset its settings, so, e.g. na.print
	could persist when printing a list.

    o	[cr]bind could sometimes return an invisible value.

    o	axis() and rug() sometimes extended the axis line too far.
	rug() always clipped x values to the plot region, but now
	admits to doing so with a warning.

    o	plot() and axis() got into trouble with very small relative
	ranges: these are now required to be at least 100x the machine
	precision.

    o	split.screen(, erase=TRUE) failed to create a new plot, so
	failed if it was used on a postscript device before other plots.

    o	plotting with lwd = 0 also set the dash length to 0: now
	dash lengths are scaled up for lwd > 1 but not reduced for
	0 <= lwd < 1.

    o	plotting a " " vertically caused an X11 error with some fonts,
	(notably URW fonts on RedHat) causing plot.lm to crash R

    o	F distributions with huge DF now behave more sensibly

    o	Crashes could occur if there was an error in inline
	parameters, because the call was not being recorded. It is
	now.

    o	Title field of DESCRIPTION now overrides TITLE file.

    o	R now reports `50 or more warnings', not just 50, as it only
	displays the first 50.

    o	Resetting the RNG state resets the state of the Box-Muller
	generator too.

    o	Pointer protection bug in load() code.

    o	Assignment with unknown string index caused memory corruption
	when used on matrices.

    o	It is now possible to call Fortran routines d1mach and 11mach
	on platforms which do not append underscores.

    o	Additions to plots by identify() and locator() were not being
	recorded, and so did not appear when a plot was copied or
	printed.

    o	The defaults for `na.action' arguments were inconsistently
	documented. In R the default is taken from the
	options(na.action) setting, and that defaults to `na.omit'.
	If there is no `na.action' setting, the default is `na.fail'.
	For consistency, the default for replications() has been
	changed.

    o	Fix cases with lambda==0 in Poisson distribution

    o	demo(is.things) had been broken by the introduction of is.element.

    o	palette() didn't check for overflow and was limited to 256
	colors, so palette(colors()) would segfault. Limit increased
	to 1024 and check inserted.

    o	C functions fprec() and fround() [= R's signif() and round()],
	now use R_pow_di(10., n) which is clean and more efficient.
	This changes some results in the least significant bits.

    o	pmin(c(a=1), 2:3) now works {and pmax(.) too}.


	*********************************************************
	*							*
	*	News of 0.99.0 and earlier is in file 'NEWS.0'	*
	*							*
	*********************************************************
