\input texinfo
@c %**start of header
@setfilename R-lang.info
@settitle R Language Definition
@setchapternewpage on
@c %**end of header

@syncodeindex fn vr

@dircategory Programming
@direntry
* R Language: (R-lang).      The R Language Definition.
@end direntry

@finalout

@include R-defs.texi
@include version.texi

@macro C {}
@strong{C}
@end macro

@copying
This manual is for R, version @value{VERSION}.

@Rcopyright{2000}

@quotation
@permission{}
@end quotation
@end copying

@titlepage
@title R Language Definition
@subtitle Version @value{VERSION} @b{DRAFT}
@author R Core Team
@page
@vskip 0pt plus 1filll
@insertcopying
@end titlepage

@ifplaintext
@insertcopying
@end ifplaintext

@c @ifnothtml
@contents
@c @end ifnothtml

@ifnottex
@node Top, Introduction, (dir), (dir)
@top R Language Definition

This is an introduction to the @R{} language, explaining evaluation,
parsing, object oriented programming, computing on the language, and so
forth.

@insertcopying

@end ifnottex

@menu
* Introduction::                
* Objects::                     
* Evaluation of expressions::   
* Functions::                   
* Object-oriented programming::  
* Computing on the language::   
* System and foreign language interfaces::  
* Exception handling::          
* Debugging::                   
* Parser::                      
* Function and Variable Index::  
* Concept Index::               
* References::                  
@end menu

@node Introduction, Objects, Top, Top
@comment  node-name,  next,  previous,  up
@chapter Introduction

@R{} is a system for statistical computation and graphics. It
provides, among other things, a programming language, high level
graphics, interfaces to other languages and debugging facilities.  This
manual details and defines the @R{} language.

The @R{} language is a dialect of @Sl{} which was designed in the 1980s
and has been in widespread use in the statistical community since.
Its principal designer, John M. Chambers, was awarded the 1998 ACM
Software Systems Award for @Sl{}.

The language syntax has a superficial similarity with C, but the
semantics are of the FPL (functional programming language) variety with
stronger affinities with Lisp and @acronym{APL}.  In particular, it
allows ``computing on the language'', which in turn makes it possible to
write functions that take expressions as input, something that is often
useful for statistical modeling and graphics.

It is possible to get quite far using @R{} interactively, executing
@cindex expression
simple expressions from the command line.  Some users may never need to
go beyond that level, others will want to write their own functions
either in an ad hoc fashion to systematize repetitive work or with the
perspective of writing add-on packages for new functionality.

The purpose of this manual is to document the language @emph{per se}.
That is, the objects that it works on, and the details of the expression
evaluation process, which are useful to know when programming @R{}
functions.  Major subsystems for specific tasks, such as graphics, are
only briefly described in this manual and will be documented separately.

Although much of the text will equally apply to @Sl{}, there are also
some substantial differences, and in order not to confuse the issue we
shall concentrate on describing @R{}.

The design of the language contains a number of fine points and
common pitfalls which may surprise the user.  Most of these are due to
consistency considerations at a deeper level, as we shall explain.
There are also a number of useful shortcuts and idioms, which allow the
user to express quite complicated operations succinctly.  Many of these
become natural once one is familiar with the underlying concepts.  In
some cases, there are multiple ways of performing a task, but some of
the techniques will rely on the language implementation, and others work
at a higher level of abstraction.  In such cases we shall indicate the
preferred usage.

Some familiarity with @R{} is assumed.  This is not an introduction to
@R{} but rather a programmers' reference manual.  Other manuals provide
complementary information: in particular @ref{Preface, , , R-intro, An
Introduction to R} provides an introduction to @R{} and @ref{System and
foreign language interfaces, , , R-exts, Writing R Extensions} details
how to extend @R{} using compiled code.



@node Objects, Evaluation of expressions, Introduction, Top
@chapter Objects

@c needs to be clarified. What is a pointer, what is the pointed object,
@c what is the context of the pointed object?
In every computer language
@cindex variable
variables provide a means of accessing the data stored in memory.  @R{}
does not provide direct access to the computer's memory but rather
provides a number of specialized data structures we will refer to as
@cindex object
objects.  These objects
are referred to through symbols or variables.  In @R{}, however, the
symbols are themselves objects and can be manipulated in the same way as
any other object.  This is different from many other languages and has
wide ranging effects.

In this chapter we provide preliminary descriptions of the various data
structures provided in @R{}.  More detailed discussions of many of them
will be found in the subsequent chapters.  The @R{} specific function
@code{typeof}
@findex typeof
@cindex type
returns the @dfn{type} of an @R{} object.  Note that in the C code
underlying @R{}, all objects are pointers to a structure with typedef
@code{SEXPREC}; the different @R{} data types are represented in C by
@code{SEXPTYPE}, which determines how the information in the various
parts of the structure is used.

The following table describes the possible values returned by
@code{typeof} and what they are.

@quotation
@multitable @columnfractions 0.2 0.7
@item @code{"NULL"} @tab NULL
@item @code{"symbol"} @tab a variable name
@item @code{"pairlist"}@tab a pairlist object (mainly internal)
@item @code{"closure"} @tab a function
@item @code{"environment"} @tab an environment
@cindex evaluation, lazy
@item @code{"promise"}  @tab an object used to implement lazy evaluation 
@item @code{"language"} @tab an @R{} language construct
@item @code{"special"}  @tab an internal function that does not evaluate its arguments
@item @code{"builtin"} @tab an internal function that evaluates its arguments
@item @code{"char"} @tab a `scalar' string object (internal only) ***
@item @code{"logical"} @tab a vector containing logical values
@item @code{"integer"} @tab a vector containing integer values
@item @code{"double"}  @tab a vector containing real values
@item @code{"complex"} @tab a vector containing complex values
@item @code{"character"} @tab a vector containing character values
@item @code{"..."} @tab the special variable length argument ***
@item @code{"any"} @tab a special type that matches all types: there are no objects of this type
@item @code{"expression"} @tab an expression object
@item @code{"list"} @tab a list
@item @code{"bytecode"} @tab byte code (internal only) ***
@item @code{"externalptr"} @tab an external pointer object
@item @code{"weakref"} @tab a weak reference object
@item @code{"raw"} @tab a vector containing bytes
@item @code{"S4"} @tab an S4 object which is not a simple object
@end multitable
@end quotation

@noindent
Users cannot easily get hold of objects of types marked with a `***'.


@findex mode
@cindex mode
Function @code{mode} gives information about the @dfn{mode} of an object
in the sense of Becker, Chambers & Wilks (1988), and is more compatible
with other implementations of the @Sl{} language.
@c FIXME:
@c Should say that many R functions, such as vector(), actually have an
@c argument `mode' rather than `type'.  E.g., vector(mode = "double")
@c actually creates an object of *type* "double" but *mode* "numeric".
@c </FIXME>
@findex storage.mode
Finally, the function @code{storage.mode} returns the @dfn{storage mode}
of its argument in the sense of Becker et al.@: (1988).  It is generally
used when calling functions written in another language, such as C or
FORTRAN, to ensure that @R{} objects have the data type expected by the
routine being called.  (In the @Sl{} language, vectors with integer or
real values are both of mode @code{"numeric"}, so their storage modes
need to be distinguished.)

@example
> x <- 1:3
> typeof(x)
[1] "integer"
> mode(x)
[1] "numeric"
> storage.mode(x)
[1] "integer"
@end example

@R{}
@cindex object
objects are often coerced to different
@cindex type
types during computations.
There are also many functions available to perform explicit
@cindex coercion
coercion.
When programming in the @R{} language the type of an object generally
doesn't affect the computations, however, when dealing with foreign
languages or the operating system it is often necessary to ensure that
an object is of the correct type.

@menu
* Basic types::                 
* Attributes::                  
* Special compound objects::    
@end menu

@node Basic types, Attributes, Objects, Objects
@cindex type
@section Basic types


@menu
* Vector objects::              
* List objects::                
* Language objects::            
* Expression objects::          
* Function objects::            
* NULL object::                 
* Builtin objects and special forms::  
* Promise objects::             
* Dot-dot-dot::                 
* Environment objects::         
* Pairlist objects::            
* Any-type::                    
@end menu

@node Vector objects, List objects, Basic types, Basic types
@subsection Vectors

@cindex vector
Vectors can be thought of as contiguous cells containing data.  Cells
are accessed through
@cindex index
indexing operations such as
@code{x[5]}.  More details are given in @ref{Indexing}.
@c @ref{Data structures}

@cindex type
@cindex mode
@cindex atomic
@R{} has six basic (`atomic') vector types: logical, integer, real,
complex, string (or character) and raw.  The modes and storage modes for
the different vector types are listed in the following table.

@quotation
@multitable {@code{character}} {@code{character}} {@code{character}}
@headitem typeof       @tab mode             @tab storage.mode
@item @code{logical}   @tab @code{logical}   @tab @code{logical}
@item @code{integer}   @tab @code{numeric}   @tab @code{integer}
@item @code{double}    @tab @code{numeric}   @tab @code{double}
@item @code{complex}   @tab @code{complex}   @tab @code{complex}
@item @code{character} @tab @code{character} @tab @code{character}
@item @code{raw}       @tab @code{raw}       @tab @code{raw}
@end multitable
@end quotation

Single numbers, such as @code{4.2}, and strings, such as @code{"four
point two"} are still vectors, of length 1; there are no more basic
types.  Vectors with length zero are possible (and useful).

String vectors have mode and storage mode @code{"character"}. A single
element of a character vector is often referred to as a @emph{character
string}.


@node List objects, Language objects, Vector objects, Basic types
@subsection Lists

Lists (``generic vectors'') are another kind of data storage.  Lists
have elements, each of which can contain any type of @R{} object, i.e.@:
the elements of a list do not have to be of the same type.  List
elements are accessed through three different
@cindex index
indexing operations.
These are explained in detail in @ref{Indexing}.
@c @ref{Data structures}.

Lists are vectors, and the basic vector types are referred to as
@emph{atomic vectors} where it is necessary to exclude lists.

@node Language objects, Expression objects, List objects, Basic types
@subsection Language objects

There are three types of objects that constitute the @R{} language.
They are @emph{calls}, @emph{expressions}, and @emph{names}.
@cindex call
@cindex expression
@cindex name
@c FIXME:
@c Better consistently refer to objects of type "expression" as
@c ``expression objects'' ...
Since @R{} has objects of type @code{"expression"} we will try to avoid
the use of the word expression in other contexts.  In particular
syntactically correct expressions will be referred to as
@emph{statements}.
@c </FIXME>
@cindex statement

These objects have modes @code{"call"}, @code{"expression"}, and
@code{"name"}, respectively.
@c FIXME: Shouldn't we explain their types?

They can be created directly from expressions using the @code{quote}
mechanism and converted to and from lists by the @code{as.list} and
@code{as.call} functions.
@findex quote
@findex as.list
@findex as.call
Components of the
@cindex parsing
parse tree can be extracted using the standard
indexing operations.

@menu
* Symbol objects::              
@end menu

@node Symbol objects,  , Language objects, Language objects
@subsubsection Symbol objects


@cindex symbol
Symbols refer to @R{}
@cindex object
objects.  The
@cindex name
name of any @R{} object is usually a
symbol.  Symbols can be created through the functions @code{as.name} and
@code{quote}.

@cindex symbol
@cindex mode
Symbols have mode @code{"name"}, storage mode @code{"symbol"}, and type
@code{"symbol"}.  They can be
@cindex coercion
coerced to and from character strings
using @code{as.character} and @code{as.name}.
@findex as.character
@findex as.name
@cindex parsing
They naturally appear as atoms of parsed expressions, try e.g.@:
@code{as.list(quote(x + y))}.

@node Expression objects, Function objects, Language objects, Basic types
@subsection Expression objects

In @R{} one can have objects of type @code{"expression"}.  An
@emph{expression} contains one or more statements.  A statement is a
syntactically correct collection of
@cindex token
tokens.
@cindex expression object
Expression objects are special language objects which contain parsed but
unevaluated @R{} statements.  The main difference is that an expression
object can contain several such expressions.  Another more subtle
difference is that objects of type @code{"expression"} are only
@cindex evaluation, expression
evaluated when
explicitly passed to @code{eval}, whereas other language objects may get
evaluated in some unexpected cases.

An
@cindex expression object
expression object behaves much like a list and its components should
be accessed in the same way as the components of a list.

@node Function objects, NULL object, Expression objects, Basic types
@subsection Function objects

@cindex function
In @R{} functions are objects and can be manipulated in much the same
way as any other object.  Functions (or more precisely, function
closures) have three basic components:  a formal argument list, a body
and an
@cindex environment
environment.  The argument list is a comma-separated list of
arguments.  An
@cindex argument
argument can be a symbol, or a @samp{@var{symbol} =
@var{default}} construct, or the special argument @code{...}.  The
second form of argument is used to specify a default value for an
argument.  This value will be used if the function is called without any
value specified for that argument.  The @code{...}  argument is special
and can contain any number of arguments.  It is generally used if the
number of arguments is unknown or in cases where the arguments will be
passed on to another function.

The body is a parsed @R{} statement.  It is usually a collection of
statements in braces but it can be a single statement, a symbol or even
a constant.

A function's
@cindex function
@cindex environment
environment is the environment that was active at the time
that the function was created.  Any symbols bound in that environment
are @emph{captured} and available to the function. This combination of
the code of the function and the bindings in its environment is called a
`function closure', a term from functional programming theory. In this
document we generally use the term `function', but use `closure' to
emphasize the importance of the attached environment.

It is possible to extract and manipulate the three parts of a closure
object using @code{formals}, @code{body}, and @code{environment}
constructs (all three can also be used on the left hand side of
@cindex assignment
assignments).
@findex formals
@findex body
@findex environment
The last of these can be used to remove unwanted environment capture.

When a function is called, a new environment (called the
@emph{evaluation environment}) is created, whose enclosure (see
@ref{Environment objects}) is the environment from the function closure.
This new environment is initially populated with the unevaluated
arguments to the function; as evaluation proceeds, local variables are
created within it.

@cindex function
There is also a facility for converting functions to and from list
structures using @code{as.list} and @code{as.function}.
@findex as.function
These have been included to provide compatibility with @Sl{} and their
use is discouraged.

@node NULL object, Builtin objects and special forms, Function objects, Basic types
@subsection NULL

There is a special object called @code{NULL}.  It is used whenever there
is a need to indicate or specify that an object is absent.  It should not be
confused with a vector or list of zero length.
@findex NULL

The @code{NULL} object has no type and no modifiable properties.  There
is only one @code{NULL} object in @R{}, to which all instances refer. To
test for @code{NULL} use @code{is.null}.  You cannot set attributes on
@code{NULL}.


@node Builtin objects and special forms, Promise objects, NULL object, Basic types
@subsection Builtin objects and  special forms

These two kinds of object contain the builtin
@cindex function
@cindex .Primitive
@cindex .Internal
functions of @R{}, i.e., those that are displayed as @code{.Primitive}
in code listings (as well as those accessed via the @code{.Internal}
function and hence not user-visible as objects).  The difference between
the two lies in the argument handling.  Builtin functions have all
their arguments evaluated and passed to the internal function, in
accordance with @emph{call-by-value}, whereas special functions pass the
unevaluated arguments to the internal function.

From the @R{} language, these objects are just another kind of function.
The @code{is.primitive} function can distinguish them from interpreted
@cindex function
functions.

@node Promise objects, Dot-dot-dot, Builtin objects and special forms, Basic types
@subsection Promise objects

@cindex promise
Promise objects are part of @R{}'s lazy evaluation mechanism.  They
contain three slots: a value, an expression, and an
@cindex environment
environment.  When a
@cindex function
@cindex function argument
function is called the arguments are matched and then each of the formal
arguments is bound to a promise.  The expression that was given for that
formal argument and a pointer to the environment the function was called
from are stored in the promise.

Until that argument is accessed there is no @emph{value} associated with
the promise.  When the argument is accessed, the stored expression is
@cindex evaluation, expression
evaluated in the stored environment, and the result is returned.  The
result is also saved by
the promise.  The @code{substitute} function will extract the content
of the expression slot.  This allows the programmer to
access either the value or the expression associated with the promise.

Within the @R{} language, promise objects are almost only seen
implicitly: actual function arguments are of this type.  There is also a
@code{delayedAssign} function that will make a promise out of an
expression.  There is generally no way in @R{} code to check whether an
object is a promise or not, nor is there a way to use @R{} code to
determine the environment of a promise.

@node Dot-dot-dot, Environment objects, Promise objects, Basic types
@subsection Dot-dot-dot

The @code{...} object type is stored as a type of pairlist.  The
components of @code{...} can be accessed in the usual pairlist manner
from C code, but @code{...} is not easily accessed as an object in
interpreted code, and even the existence of such an object should typically
not be assumed, as that may change in the future.

The object can be captured (with promises being forced!) as a list, so for example in
@code{table} one sees

@example
    args <- list(...)
## ....
    for (a in args) @{
## ....
@end example

Note that the implementation of @code{...} as a pairlist object is
@emph{not} to be considered part of the R API, and code outside base @R{}
should not rely on this current description of @code{...}.
On the other hand, the above @code{list(...)} access, and the other
``dot-access'' functions @code{...length()}, @code{...elt()}, @code{...names()},
and ``reserved words'' @code{..1}, @code{..2}, etc, see also help page @code{?dots},
are part of the stable R API.

@cindex function
@cindex function argument
If a function has @code{...} as a formal argument then any actual
arguments that do not match a formal argument are matched with
@code{...}.

@node Environment objects, Pairlist objects, Dot-dot-dot, Basic types
@subsection Environments

@cindex environment
Environments can be thought of as consisting of two things.  A
@emph{frame}, consisting of a set of symbol-value pairs, and an
@emph{enclosure}, a pointer to an enclosing environment. When @R{}
looks up the value for a symbol the frame is examined and if a
matching symbol is found its value will be returned.  If not, the
enclosing environment is then accessed and the process repeated.
Environments form a tree structure in which the enclosures play the
role of parents.  The tree of environments is rooted in an empty
@findex emptyenv 
environment, available through @code{emptyenv()}, which has no parent.
It is the direct parent of the environment of the base package
@findex baseenv 
(available through the @code{baseenv()} function).
@c Formerly @code{baseenv()} had the special value @code{NULL}, but as from
@c version 2.4.0, the use of @code{NULL} as an environment is defunct.

Environments are created implicitly by function calls, as described in
@ref{Function objects} and @ref{Lexical environment}.  In this case the
environment contains the variables local to the function (including the
arguments), and its enclosure is the environment of the currently called
function.  Environments may also be created directly by @code{new.env}.
@findex new.env
The frame content of an environment can be accessed by use of @code{ls},
@code{names}, @code{$}, @code{[}, @code{[[}, @code{get}, and @code{get0},
@findex get
@findex get0
and manipulated by @code{$<-}, @code{[[<-}, and @code{assign}
@findex assign
as well as @code{eval} and @code{evalq}.


The @code{parent.env} function may be used to access the enclosure of
an environment.

Unlike most other @R{} objects, environments are not copied when passed
to functions or used in assignments.  Thus, if you assign the same
environment to several symbols and change one, the others will change
too.  In particular, assigning attributes to an environment can lead to
surprises.

@node Pairlist objects, Any-type, Environment objects, Basic types
@subsection Pairlist objects

@cindex pairlist
Pairlist objects are similar to Lisp's dotted-pair lists.  They are used
extensively in the internals of @R{}, but are rarely visible in
interpreted code, although they are returned by @code{formals}, and can
be created by (e.g.) the @code{pairlist} function. A zero-length
pairlist is @code{NULL}, as would be expected in Lisp but in contrast to
a zero-length list.
@findex pairlist
Each such object has three slots, a CAR value, a CDR value and a TAG
value.  The TAG value is a text string and CAR and CDR usually
represent, respectively, a list item (head) and the remainder (tail) of
the list with a NULL object as terminator (the CAR/CDR terminology is
traditional Lisp and originally referred to the address and decrement
registers on an early 60's IBM computer).
@c FIXME: Check: Is it *required* that TAG is a STRSXP and CDR is a
@c LISTSXP?? (or NULL of course).
@c Well, it is CHARSXP.

Pairlists are handled in the @R{} language in exactly the same way as
generic vectors (``lists'').  In particular, elements are accessed using
the same @code{[[]]} syntax.  The use of pairlists is deprecated since
generic vectors are usually more efficient to use.  When an internal
pairlist is accessed from @R{} it is generally (including when
subsetted) converted to a generic vector.
@c FIXME: There are still exceptions.  Change code or docs?

In a very few cases pairlists are user-visible: one is @code{.Options}.

@node Any-type,  , Pairlist objects, Basic types
@subsection The ``Any'' type

It is not really possible for an object to be of ``Any'' type, but it is
nevertheless a valid type value.  It gets used in certain (rather rare)
circumstances, e.g.@: @code{as.vector(x, "any")}, indicating that type
@cindex coercion
coercion should not be done.

@c @node External pointer objects
@c @subsection External pointer objects

@node Attributes, Special compound objects, Basic types, Objects
@section Attributes
@cindex attributes

@cindex object
All objects except @code{NULL} can have one or more attributes attached
to them.  Attributes are stored as a pairlist where all elements are
named, but should be thought of as a set of name=value pairs.  A listing
of the attributes can be obtained using @code{attributes} and set by
@code{attributes<-},
@findex attributes
@findex attributes<-
individual components are accessed using @code{attr} and @code{attr<-}.
@findex attr
@findex attr<-
@c Shouldn't we discuss replacement functions before this?

@c This is a bad example: levels<- is generic.
Some attributes have special accessor
@cindex function, accessor
functions (e.g.@: @code{levels<-}
for factors) and these should be used when available. In addition to
hiding details of implementation they may perform additional operations.
@R{} attempts to intercept calls to @code{attr<-} and to
@code{attributes<-} that involve the special attributes and enforces
the consistency checks.

Matrices and arrays are simply vectors with the attribute @code{dim} and
optionally @code{dimnames} attached to the vector.

Attributes are used to implement the class structure used in @R{}.  If an
object has a @code{class} attribute then that attribute will be examined
during
@cindex evaluation, symbol
evaluation.  The class structure in @R{} is described in detail
in @ref{Object-oriented programming}.

@menu
* Names::                       
* Dimensions::                  
* Dimnames::                    
* Classes::                     
* Time series attributes::      
* Copying of attributes::       
@end menu

@node Names, Dimensions, Attributes, Attributes
@subsection Names

A @code{names} attribute, when present, labels the individual elements of
a vector or list.  When an object is printed the @code{names} attribute,
when present, is used to label the elements.  The @code{names} attribute
can also be used for indexing purposes, for example,
@code{quantile(x)["25%"]}.

One may get and set the names using @code{names} and @code{names<-}
constructions.
@findex names
@findex names<-
@cindex type
The latter will perform the necessary consistency checks to ensure that
the names attribute has the proper type and length.

Pairlists and one-dimensional arrays are treated specially. For pairlist
objects, a virtual @code{names} attribute is used; the @code{names}
attribute is really constructed from the tags of the list components.
For one-dimensional arrays the @code{names} attribute really accesses
@code{dimnames[[1]]}.

@node Dimensions, Dimnames, Names, Attributes
@subsection Dimensions

The @code{dim} attribute is used to implement arrays.  The content of
the array is stored in a vector in column-major order and the @code{dim}
attribute is a vector of integers specifying the respective extents of
the array.  @R{} ensures that the length of the vector is the product of
the lengths of the dimensions. The length of one or more dimensions may
be zero.

@cindex vector
A vector is not the same as a one-dimensional array since the latter has
a @code{dim} attribute of length one, whereas the former has no
@code{dim} attribute.

@node Dimnames, Classes, Dimensions, Attributes
@subsection Dimnames

Arrays may name each dimension separately using the @code{dimnames}
attribute which is a list of character vectors.  The @code{dimnames}
list may itself have names which are then used for extent headings when
printing arrays.

@node Classes, Time series attributes, Dimnames, Attributes
@subsection Classes

@R{} has an elaborate class system@footnote{actually two, but this draft
manual predates the @pkg{methods} package.}, principally controlled via
the @code{class} attribute.  This attribute is a character vector
containing the list of classes that an object inherits from.  This forms
the basis of the ``generic methods'' functionality in @R{}.

This attribute can be accessed and manipulated virtually without
restriction by users.  There is no checking that an object actually
contains the components that class methods expect.  Thus, altering the
@code{class} attribute should be done with caution, and when they are
available specific creation and
@cindex coercion
coercion functions should be preferred.

@node Time series attributes, Copying of attributes, Classes, Attributes
@subsection Time series attributes

The @code{tsp} attribute is used to hold parameters of time series,
start, end, and frequency.  This construction is mainly used to handle
series with periodic substructure such as monthly or quarterly data.

@node Copying of attributes,  , Time series attributes, Attributes
@subsection Copying of attributes

Whether attributes should be copied when an object is altered is a
complex area, but there are some general rules (Becker, Chambers &
Wilks, 1988, pp. 144--6).

Scalar functions (those which operate element-by-element on a vector and
whose output is similar to the input) should preserve attributes (except
perhaps class).

Binary operations normally copy most attributes from the longer argument
(and if they are of the same length from both, preferring the values on
the first).  Here `most' means all except the @code{names}, @code{dim}
and @code{dimnames} which are set appropriately by the code for the
operator.

Subsetting (other than by an empty index) generally drops all attributes
except @code{names}, @code{dim} and @code{dimnames} which are reset as
appropriate.  On the other hand, subassignment generally preserves
attributes even if the length is changed.  Coercion drops all
attributes.

The default method for sorting drops all attributes except names, which
are sorted along with the object.


@node Special compound objects,  , Attributes, Objects
@section Special compound objects

@menu
* Factors::                     
* Data frame objects::          
@end menu

@node Factors, Data frame objects, Special compound objects, Special compound objects
@subsection Factors

Factors are used to describe items that can have a finite number of
values (gender, social class, etc.).  A factor has a @code{levels}
attribute and class @code{"factor"}.  Optionally, it may also contain a
@code{contrasts} attribute which controls the parametrisation used when
the factor is used in a
@cindex function, modeling
@cindex modeling function
modeling functions.

A factor may be purely nominal or may have ordered categories.  In the
latter case, it should be defined as such and have a @code{class} vector
@code{c("ordered"," factor")}.

Factors are currently implemented using an integer array to specify the
actual levels and a second array of names that are mapped to the
integers.  Rather unfortunately users often make use of the
implementation in order to make some calculations easier.  This,
however, is an implementation issue and is not guaranteed to hold in all
implementations of @R{}.

@node Data frame objects,  , Factors, Special compound objects
@subsection Data frame objects

Data frames are the @R{} structures which most closely mimic the SAS or
SPSS data set, i.e.@: a ``cases by variables'' matrix of data.

A data frame is a list of vectors, factors, and/or matrices all having
the same length (number of rows in the case of matrices).  In addition,
a data frame generally has a @code{names} attribute labeling the
variables and a @code{row.names} attribute for labeling the cases.

A data frame can contain a list that is the same length as the other
components.  The list can contain elements of differing lengths thereby
providing a data structure for ragged arrays.  However, as of this
writing such arrays are not generally handled correctly.

@c FIXME: these details really need to be filled in

@c  @node Type checking and coercion,  , Special compound objects, Objects
@c  @section Type checking and coercion

@c  For most of the basic data types we can check the type and coerce
@c  objects of one type to another type.  Should we have a table???

@c  @menu
@c  * mode/typeof::
@c  * Specific types::
@c  * Metatypes::
@c  @end menu

@c  @node mode/typeof, Specific types, Type checking and coercion, Type checking and coercion
@c  @subsection mode/typeof

@c  @node Specific types, Metatypes, mode/typeof, Type checking and coercion
@c  @subsection Specific types

@c  @node Metatypes,  , Specific types, Type checking and coercion
@c  @subsection Metatypes

@c  @findex is.numeric
@c  @findex is.finite

@c ------------------------------
@c  @node Data structures, Evaluation of expressions, Objects, Top
@c  @chapter Data structures

@c  @menu
@c  * Vectors::
@c  * Lists::
@c  * Arrays::
@c  * Matrices::
@c  * Assignment::
@c  * Matrix operations::
@c  * Data Frames::
@c  @end menu

@c  @node Vectors, Lists, Data structures, Data structures
@c  @section Vectors

@c  @node Lists, Arrays, Vectors, Data structures
@c  @section Lists

@c  @node Arrays, Matrices, Lists, Data structures
@c  @section Arrays

@c  @node Matrices, Assignment, Arrays, Data structures
@c  @section Matrices

@c  @node Assignment, Matrix operations, Matrices, Data structures
@c  @section Assignment

@c  @menu
@c  * simple::
@c  * indexed::
@c  * function::
@c  @end menu

@c  @node simple, indexed, Assignment, Assignment
@c  @subsection simple

@c  @node indexed, function, simple, Assignment
@c  @subsection indexed

@c  @node function,  , indexed, Assignment
@c  @subsection function

@c  @node Matrix operations, Data Frames, Assignment, Data structures
@c  @section Matrix operations

@c  @node Data Frames,  , Matrix operations, Data structures
@c  @section Data Frames

@node Evaluation of expressions, Functions, Objects, Top
@comment  node-name,  next,  previous,  up
@chapter Evaluation of expressions

When a user types a command at the prompt (or when an expression is read
from a file) the first thing that happens to it is that the command is
transformed by the
@cindex parsing
parser into an internal representation.  The
evaluator executes parsed @R{} expressions and returns the value of the
expression.  All expressions have a value.  This is the core of the
language.

This chapter describes the basic mechanisms of the evaluator, but avoids
discussion of specific functions or groups of functions which are
described in separate chapters later on or where the help pages should
be sufficient documentation.

Users can construct expressions and invoke the evaluator on them.

@menu
* Simple evaluation::           
* Control structures::          
* Elementary arithmetic operations::  
* Indexing::                    
* Scope of variables::          
@end menu

@node Simple evaluation, Control structures, Evaluation of expressions, Evaluation of expressions
@section Simple evaluation

@menu
* Constants::                   
* Symbol lookup::               
* Function calls::              
* Operators::                   
@end menu

@node Constants, Symbol lookup, Simple evaluation, Simple evaluation
@subsection Constants

Any number typed directly at the prompt is a constant and is evaluated.

@example
> 1
[1] 1
@end example

@noindent
Perhaps unexpectedly, the number returned from the expression @code{1}
is a numeric.  In most cases, the difference between an integer and a
numeric value will be unimportant as R will do the right thing when
using the numbers.  There are, however, times when we would like to
explicitly create an integer value for a constant.  We can do this by
calling the function @code{as.integer} or using various other
techniques. But perhaps the simplest approach is to qualify our 
constant with the suffix character `L'.
For example, to create the integer value 1, we might use

@example
> 1L
[1]
@end example

We can use the `L' suffix to qualify any number with the intent of
making it an explicit integer.  So `0x10L' creates the integer value
16 from the hexadecimal representation.  The constant @code{1e3L} gives 1000
as an integer rather than a numeric value and is equivalent to @code{1000L}.
(Note that the `L' is treated as qualifying the term @code{1e3} and not the
@code{3}.)  If we qualify a value with `L' that is not an integer value,
e.g.@: @code{1e-3L}, we get a warning and the numeric value is created.
A warning is also created if there is an unnecessary decimal point
in the number, e.g.@: @code{1.L}.

We get a syntax error when using `L' with complex numbers,
e.g.@: @code{12iL} gives an error.

Constants are fairly boring and to do more we need symbols.

@node Symbol lookup, Function calls, Constants, Simple evaluation
@subsection Symbol lookup

When a new variable is created it must have a
@cindex name
name so it can be referenced and it usually has a value.  The name itself is a
@cindex symbol
symbol.
When a symbol is
@cindex evaluation, symbol
evaluated its
@cindex value
value is returned.  Later we shall
explain in detail how to determine the value associated with a symbol.

In this small example @code{y} is a symbol and its value is 4.  A symbol
is an @R{} object too, but one rarely needs to deal with symbols
directly, except when doing ``programming on the language''
(@ref{Computing on the language}).

@example
> y <- 4
> y
[1] 4
@end example

@c FIXME: Probably needs to go somewhere, but not here (parser section?)
@c FIXME: Up to date info is in the subsection 'Reserved words'.

@c  @node Key words, Calling functions, Symbol lookup, Simple evaluation
@c  @subsection Key words

@c  @R{} contains a number of key words.  These are symbols that the parser
@c  treats in a special fashion.  They are,

@c  @quotation
@c  @multitable @columnfractions 0.2 0.7
@c  @item @code{NULL}  @tab the null object
@c  @item @code{NA}    @tab missing value
@c  @item @code{TRUE}  @tab logical true
@c  @item @code{FALSE} @tab logical false
@c  @item @code{Inf}   @tab infinity
@c  @item @code{NaN}   @tab not a number
@c  @item @code{function} @tab a special form for creating functions
@c  @item @code{while} @tab while flow control
@c  @item @code{repeat} @tab repeat flow control
@c  @item @code{for}   @tab for flow control
@c  @item @code{if}    @tab if--then--else statements
@c  @item @code{in}    @tab used in flow control
@c  @item @code{else}  @tab part of the if--then--else construct
@c  @item @code{next}  @tab flow control
@c  @item @code{break} @tab flow control
@c  @item @code{...}   @tab special argument for functions
@c  @end multitable

@c  @end quotation

@node Function calls, Operators, Symbol lookup, Simple evaluation
@subsection Function calls

Most of the computations carried out in @R{} involve the evaluation of
functions.  We will also refer to this as
@cindex function invocation
function @emph{invocation}.
Functions are invoked by name with a list of arguments separated by
commas.

@example
> mean(1:10)
[1] 5.5
@end example

@noindent
In this example the function @code{mean} was called with one argument,
the vector of integers from 1 to 10.

@R{} contains a huge number of functions with different purposes.  Most
are used for producing a result which is an @R{} object, but others are
used for their side effects, e.g., printing and plotting functions.

@cindex function
@cindex function arguments
Function calls can have @emph{tagged} (or @emph{named}) arguments, as in
@code{plot(x, y, pch = 3)}.  Arguments without tags are known as
@emph{positional} since the function must distinguish their meaning from
their sequential positions among the arguments of the call, e.g., that
@code{x} denotes the abscissa variable and @code{y} the ordinate.  The
use of tags/names is an obvious convenience for functions with a large
number of optional arguments.

@cindex function, assignment
A special type of function calls can appear on the left hand side of
the
@cindex assignment
assignment operator as in

@example
> class(x) <- "foo"
@end example

@noindent
What this construction really does is to call the function
@code{class<-} with the original object and the right hand side.  This
function performs the modification of the object and returns the result
which is then stored back into the original variable.  (At least
conceptually, this is what happens.  Some additional effort is made to
avoid unnecessary data duplication.)

@c FIXME something about common constructor functions: c,
@c array, matrix, list, structure (with a warning to use the
@c latter with discretion),

@node Operators,  , Function calls, Simple evaluation
@subsection Operators

@R{} allows the use of arithmetic expressions using operators similar to
those of the C programming language, for instance

@example
> 1 + 2
[1] 3
@end example

Expressions can be grouped using parentheses, mixed with function calls,
and assigned to variables in a straightforward manner

@example
> y <- 2 * (a + log(x))
@end example

@R{} contains a number of operators.  They are listed in the table
below.

@quotation
@multitable @columnfractions 0.1 0.7
@item @code{-}
@tab Minus, can be unary or binary
@item @code{+}
@tab Plus, can be unary or binary
@item @code{!}
@tab Unary not
@item @code{~}
@tab Tilde, used for model formulae, can be either unary or binary
@item @code{?}
@tab Help
@item @code{:}
@tab Sequence, binary (in model formulae: interaction)
@item @code{*}
@tab Multiplication, binary
@item @code{/}
@tab Division, binary
@item @code{^}
@tab Exponentiation, binary
@item @code{%@var{x}%}
@tab Special binary operators, @var{x} can be replaced by any valid name
@item @code{%%}
@tab Modulus, binary
@item @code{%/%}
@tab Integer divide, binary
@item @code{%*%}
@tab Matrix product, binary
@item @code{%o%}
@tab Outer product, binary
@item @code{%x%}
@tab Kronecker product, binary
@item @code{%in%}
@tab Matching operator, binary (in model formulae: nesting)
@item @code{<}
@tab Less than, binary
@item @code{>}
@tab Greater than, binary
@item @code{==}
@tab Equal to, binary
@item @code{>=}
@tab Greater than or equal to, binary
@item @code{<=}
@tab Less than or equal to, binary
@item @code{&}
@tab And, binary, vectorized
@item @code{&&}
@tab And, binary, not vectorized
@item @code{|}
@tab Or, binary, vectorized
@item @code{||}
@tab Or, binary, not vectorized
@item @code{<-}
@tab Left assignment, binary
@item @code{->}
@tab Right assignment, binary
@item @code{$}
@tab List subset, binary
@end multitable
@end quotation

Except for the syntax, there is no difference between applying an
operator and calling a function.  In fact, @code{x + y} can equivalently
be written @code{`+`(x, y)}.  Notice that since @samp{+} is a
non-standard function name, it needs to be quoted.

@cindex vector
@R{} deals with entire vectors of data at a time, and most of the
elementary operators and basic mathematical functions like @code{log}
are vectorized (as indicated in the table above).  This means that
e.g.@: adding two vectors of the same length will create a vector
containing the element-wise sums, implicitly looping over the vector
index.  This applies also to other operators like @code{-}, @code{*},
and @code{/} as well as to higher dimensional structures.  Notice in
particular that multiplying two matrices does not produce the usual
matrix product (the @code{%*%} operator exists for that purpose).  Some
finer points relating to vectorized operations will be discussed in
@ref{Elementary arithmetic operations}.
@c FIXME insert reference

To access individual elements of an atomic vector, one generally uses
the @code{x[i]} construction.

@example
> x <- rnorm(5)
> x
[1] -0.12526937 -0.27961154 -1.03718717 -0.08156527  1.37167090
> x[2]
[1] -0.2796115
@end example

List components are more commonly accessed using @code{x$a} or
@code{x[[i]]}.

@example
> x <- options()
> x$prompt
[1] "> "
@end example

Indexing constructs can also appear on the right hand side of an
@cindex assignment
assignment.

Like the other operators, indexing is really done by functions, and one
could have used  @code{`[`(x, 2)} instead of @code{x[2]}.

@R{}'s indexing operations contain many advanced features which are
further described in @ref{Indexing}.

@node Control structures, Elementary arithmetic operations, Simple evaluation, Evaluation of expressions
@section Control structures

Computation in @R{} consists of sequentially evaluating
@emph{statements}.  Statements, such as @code{x<-1:10} or
@code{mean(y)}, can be separated by either a semi-colon or a new line.
Whenever the
@cindex evaluation, statement
evaluator is presented with a syntactically complete
statement that statement is evaluated and the @emph{value} returned.
The result of evaluating a statement can be referred to as the value of
the statement@footnote{Evaluation always takes place in an
@cindex environment
environment.
See @ref{Scope of variables} for more details.}  The value can
always be assigned to a symbol.

Both semicolons and new lines can be used to separate statements.  A
semicolon always indicates the end of a statement while a new line
@emph{may} indicate the end of a statement.  If the current statement is
not syntactically complete new lines are simply ignored by the
evaluator.  If the session is interactive the prompt changes from
@samp{>} to @samp{+}.

@example
> x <- 0; x + 5
[1] 5
> y <- 1:10
> 1; 2
[1] 1
[1] 2
@end example

Statements can be grouped together using braces @samp{@{} and @samp{@}}.
A group of statements is sometimes called a @emph{block}.  Single
statements are evaluated when a new line is typed at the end of the
syntactically complete statement.  Blocks are not evaluated until a new
line is entered after the closing brace.  In the remainder of this
section, @emph{statement} refers to either a single statement or a
block.

@example
> @{ x <- 0
+ x + 5
+ @}
[1] 5
@end example

@menu
* if::                          
* Looping::                     
* repeat::                      
* while::                       
* for::                         
* switch::                      
@end menu

@node if, Looping, Control structures, Control structures
@subsection if

The @code{if}/@code{else} statement conditionally evaluates two
statements.  There is a @emph{condition} which is evaluated and if the
@emph{value} is @code{TRUE} then the first statement is evaluated;
otherwise the second statement will be evaluated.  The
@code{if}/@code{else} statement returns, as its value, the value of the
statement that was selected.  The formal syntax is

@example
if ( @var{statement1} )
    @var{statement2}
else
    @var{statement3}
@end example

First, @var{statement1} is evaluated to yield @var{value1}.  If
@var{value1} is a logical vector with first element @code{TRUE} then
@var{statement2} is evaluated.  If the first element of @var{value1} is
@code{FALSE} then @var{statement3} is evaluated.  If @var{value1} is a
numeric vector then @var{statement3} is evaluated when the first element
of @var{value1} is zero and otherwise @var{statement2} is evaluated.
Only the first element of @var{value1} is used.  All other elements are
ignored.  If @var{value1} has any type other than a logical or a numeric
vector an error is signalled.

@code{if}/@code{else} statements can be used to avoid numeric problems
such as taking the logarithm of a negative number.  Because
@code{if}/@code{else} statements are the same as other statements you
can assign the value of them.  The two examples below are equivalent.

@example
> if( any(x <= 0) ) y <- log(1+x) else y <- log(x)
> y <- if( any(x <= 0) ) log(1+x) else log(x)
@end example

The @code{else} clause is optional.  The statement @code{if(any(x <= 0))
x <- x[x <= 0]} is valid.  When the @code{if} statement is not in a
block the @code{else}, if present, must appear on the same line as
the end of @var{statement2}.  Otherwise the new line at the end of
@var{statement2} completes the @code{if} and yields a syntactically
complete statement that is evaluated.  A simple solution is to use a
compound statement wrapped in braces, putting the @code{else} on the
same line as the closing brace that marks the end of the statement.

@code{if}/@code{else} statements can be nested.

@example
if ( @var{statement1} ) @{
    @var{statement2}
@} else if ( @var{statement3} ) @{
    @var{statement4}
@} else if ( @var{statement5} ) @{
    @var{statement6}
@} else
    @var{statement8}
@end example

One of the even numbered statements will be evaluated and the resulting
value returned.  If the optional @code{else} clause is omitted and all
the odd numbered @var{statement}s evaluate to @code{FALSE} no statement
will be evaluated and @code{NULL} is returned.

The odd numbered @var{statement}s are evaluated, in order, until one
evaluates to @code{TRUE} and then the associated even numbered
@var{statement} is evaluated.  In this example, @var{statement6} will
only be evaluated if @var{statement1} is @code{FALSE} and
@var{statement3} is @code{FALSE} and @var{statement5} is @code{TRUE}.
There is no limit to the number of @code{else if} clauses that are
permitted.

@node Looping, repeat, if, Control structures
@subsection Looping

@R{} has three statements that provide explicit
looping.@footnote{Looping is the repeated evaluation of a statement or
block of statements.}  They are @code{for}, @code{while} and
@code{repeat}.  The two built-in constructs, @code{next} and
@code{break}, provide additional control over the evaluation. 
@R{} provides other functions for
implicit looping such as @code{tapply}, @code{apply}, and @code{lapply}.
In addition many operations, especially arithmetic ones, are vectorized
so you may not need to use a loop.

There are two statements that can be used to explicitly control looping.
They are @code{break} and @code{next}.
@findex break
@findex next
The @code{break} statement causes an exit from the innermost loop that
is currently being executed.  The @code{next} statement immediately
causes control to return to the start of the loop.  The next iteration
of the loop (if there is one) is then executed.  No statement below
@code{next} in the current loop is evaluated.

The value returned by a loop statement is always @code{NULL}
and is returned invisibly.

@node repeat, while, Looping, Control structures
@subsection repeat
@findex repeat

The @code{repeat} statement causes repeated evaluation of the body until
a break is specifically requested.  This means that you need to be
careful when using @code{repeat} because of the danger of an infinite
loop.  The syntax of the @code{repeat} loop is

@example
repeat @var{statement}
@end example

When using @code{repeat}, @var{statement} must be a block statement.
You need to both perform some computation and test whether or not to
break from the loop and usually this requires two statements.

@node while, for, repeat, Control structures
@subsection while
@findex while

The @code{while} statement is very similar to the @code{repeat}
statement.  The syntax of the @code{while} loop is

@example
while ( @var{statement1} ) @var{statement2}
@end example

@noindent
where @var{statement1} is evaluated and if its value is @code{TRUE} then
@var{statement2} is evaluated.  This process continues until
@var{statement1} evaluates to @code{FALSE}.

@node for, switch, while, Control structures
@subsection for
@findex for

The syntax of the @code{for} loop is

@example
for ( @var{name} in @var{vector} )
   @var{statement1}
@end example

@noindent
where @var{vector} can be either a vector or a list.  For each element
in @var{vector} the variable @var{name} is set to the value of that
element and @var{statement1} is evaluated.  A side effect is that the
variable @var{name} still exists after the loop has concluded and it has
the value of the last element of @var{vector} that the loop was
evaluated for.

@node switch,  , for, Control structures
@subsection switch
@findex switch

Technically speaking, @code{switch} is just another function, but its
semantics are close to those of control structures of other programming
languages.

The syntax is

@example
switch (@var{statement}, @var{list})
@end example

@noindent
where the elements of @var{list} may be named.  First, @var{statement}
is evaluated and the result, @var{value}, obtained.  If @var{value} is a
number between 1 and the length of @var{list} then the corresponding
element of @var{list} is evaluated and the result returned.  If @var{value}
is too large or too small @code{NULL} is returned.

@example
> x <- 3
> switch(x, 2+2, mean(1:10), rnorm(5))
[1]  2.2903605  2.3271663 -0.7060073  1.3622045 -0.2892720
> switch(2, 2+2, mean(1:10), rnorm(5))
[1] 5.5
> switch(6, 2+2, mean(1:10), rnorm(5))
NULL
@end example

If @var{value} is a character vector then the element of @code{...} with
a name that exactly matches @var{value} is evaluated.  If there is no
match a single unnamed argument will be used as a default.  If no
default is specified, @code{NULL} is returned.

@example
> y <- "fruit"
> switch(y, fruit = "banana", vegetable = "broccoli", "Neither")
[1] "banana"
> y <- "meat"
> switch(y, fruit = "banana", vegetable = "broccoli", "Neither")
[1] "Neither"
@end example

A common use of @code{switch} is to branch according to the character
value of one of the arguments to a function.

@example
> centre <- function(x, type) @{
+ switch(type,
+        mean = mean(x),
+        median = median(x),
+        trimmed = mean(x, trim = .1))
+ @}
> x <- rcauchy(10)
> centre(x, "mean")
[1] 0.8760325
> centre(x, "median")
[1] 0.5360891
> centre(x, "trimmed")
[1] 0.6086504
@end example

@code{switch} returns either the value of the statement that was
evaluated or @code{NULL} if no statement was evaluated.

To choose from a list of alternatives that already exists @code{switch}
may not be the best way to select one for evaluation.  It is often
better to use @code{eval} and the subset operator, @code{[[}, directly
via @code{eval(x[[condition]])}.

@node Elementary arithmetic operations, Indexing, Control structures, Evaluation of expressions
@section Elementary arithmetic operations

@menu
* Recycling rules::             
* Propagation of names::        
* Dimensional attributes::      
* NA handling::                 
@end menu

In this section, we discuss the finer points of the rules that apply to
basic operation like addition or multiplication of two vectors or
matrices.

@node Recycling rules, Propagation of names, Elementary arithmetic operations, Elementary arithmetic operations
@subsection Recycling rules
If one tries to add two structures with a different number of elements,
then the shortest is recycled to length of longest.  That is, if for
instance you add @code{c(1, 2, 3)} to a six-element vector then you will
really add @code{c(1, 2, 3, 1, 2, 3)}.  If the length of the longer
vector is not a multiple of the shorter one, a warning is given.

As from @R{} 1.4.0, any arithmetic operation involving a zero-length
vector has a zero-length result.

@node Propagation of names, Dimensional attributes, Recycling rules, Elementary arithmetic operations
@subsection Propagation of names
@cindex name
propagation of names (first one wins, I think - also if it has no
names?? ---- first one *with names* wins, recycling causes shortest to
lose names)


@node Dimensional attributes, NA handling, Propagation of names, Elementary arithmetic operations
@subsection Dimensional attributes

(matrix+matrix, dimensions must match. vector+matrix: first recycle,
then check if dims fit, error if not)

@node NA handling,  , Dimensional attributes, Elementary arithmetic operations
@subsection NA handling

Missing values in the statistical sense, that is, variables whose value
is not known, have the value @code{NA}. This should not be confused with
the @code{missing} property for a function argument that has not been
supplied (see @ref{Arguments}).
@findex missing
@findex NA
@findex NaN

@cindex type
As the elements of an atomic vector must be of the same type there are
multiple types of @code{NA} values.  There is one case where this is
particularly important to the user.  The default type of @code{NA} is
@code{logical}, unless coerced to some other type, so the appearance of
a missing value may trigger logical rather than numeric indexing (see
@ref{Indexing} for details).

Numeric and logical calculations with @code{NA} generally return
@code{NA}. In cases where the result of the operation would be the same
for all possible values the @code{NA} could take, the operation may
return this value. In particular, @samp{FALSE & NA} is @code{FALSE},
@samp{TRUE | NA} is @code{TRUE}.  @code{NA} is not equal to any other
value or to itself; testing for @code{NA} is done using @code{is.na}.
@findex is.na
However, an @code{NA} value will match another @code{NA} value in
@code{match}.

Numeric calculations whose result is undefined, such as @samp{0/0},
produce the value @code{NaN}.  This exists only in the @code{double}
type and for real or imaginary components of the complex type.  The
function @code{is.nan} is provided to check specifically for
@findex is.nan
@code{NaN}, @code{is.na} also returns @code{TRUE} for @code{NaN}.
@cindex coercion
Coercing @code{NaN} to logical or integer type gives an @code{NA} of the
appropriate type, but coercion to character gives the string
@code{"NaN"}.  @code{NaN} values are incomparable so tests of equality
or collation involving @code{NaN} will result in @code{NA}.  They are
regarded as matching any @code{NaN} value (and no other value, not even
@code{NA}) by @code{match}.

The @code{NA} of character type is as from R 1.5.0 distinct from the
string @code{"NA"}.  Programmers who need to specify an explicit string
@code{NA} should use @samp{as.character(NA)} rather than @code{"NA"}, or
set elements to @code{NA} using @code{is.na<-}.

There are constants @code{NA_integer_}, @code{NA_real_},
@code{NA_complex_} and @code{NA_character_} which will generate (in the
parser) an @code{NA} value of the appropriate type, and will be used in
deparsing when it is not otherwise possible to identify the type of an
@code{NA} (and the @code{control} options ask for this to be done).

There is no @code{NA} value for raw vectors.


@node Indexing, Scope of variables, Elementary arithmetic operations, Evaluation of expressions
@section Indexing

@R{} contains several constructs which allow access to individual
elements or subsets through indexing operations.  In the case of the
basic vector types one can access the i-th element using @code{x[i]},
but there is also indexing of lists, matrices, and multi-dimensional
arrays.  There are several forms of indexing in addition to indexing
with a single integer.  Indexing can be used both to extract part of an
object and to replace parts of an object (or to add parts).

@R{} has three basic indexing operators, with syntax displayed by the
following examples

@example
x[i]
x[i, j]
x[[i]]
x[[i, j]]
x$a
x$"a"
@end example
@findex [
@findex [[
@findex $
@cindex index

For vectors and matrices the @code{[[} forms are rarely used, although
they have some slight semantic differences from the @code{[} form (e.g.
it drops any @code{names} or @code{dimnames} attribute, and that partial
matching is used for character indices).  When indexing
multi-dimensional structures with a single index, @code{x[[i]]} or
@code{x[i]} will return the @code{i}th sequential element of @code{x}.

For lists, one generally uses @code{[[} to select any single element,
whereas @code{[} returns a list of the selected elements.

The @code{[[} form allows only a single element to be selected using
integer or character indices, whereas @code{[} allows indexing by
vectors.  Note though that for a list or other recursive object, the
index can be a vector and each element of the vector is applied in
turn to the list, the selected component, the selected component of
that component, and so on. The result is still a single element.

The form using @code{$} applies to recursive objects such as lists and
pairlists.  It allows only a literal character string or a symbol as the
index.  That is, the index is not computable: for cases where you need
to evaluate an expression to find the index, use @code{x[[expr]]}.
Applying @code{$} to a non-recursive object is an error.

@menu
* Indexing by vectors::         
* Indexing matrices and arrays::  
* Indexing other structures::   
* Subset assignment::           
@end menu

@node Indexing by vectors, Indexing matrices and arrays, Indexing, Indexing
@subsection Indexing by vectors

@R{} allows some powerful constructions using vectors as indices.  We
shall discuss indexing of simple vectors first.  For simplicity, assume
that the expression is @code{x[i]}.  Then the following possibilities
exist according to the type of @code{i}.

@itemize @bullet
@item
@cindex index
@strong{Integer}.  All elements of @code{i} must have the same sign.  If
they are positive, the elements of @code{x} with those index numbers are
selected.  If @code{i} contains negative elements, all elements except
those indicated are selected.

If @code{i} is positive and exceeds @code{length(x)} then the
corresponding selection is @code{NA}.  Negative out of bounds values
for @code{i} are silently disregarded since R version 2.6.0, S compatibly,
as they mean to drop non-existing elements and that is an empty operation
(``no-op''). 

A special case is the zero index, which has null effects: @code{x[0]} is
an empty vector and otherwise including zeros among positive or negative
indices has the same effect as if they were omitted.
@c Q: Are there any useful uses of zero indices?? A: There are cases where
@c it is useful that they are allowed and are no-ops

@item
@strong{Other numeric}.  Non-integer values are converted to integer
(by truncation towards zero) before use.

@item
@strong{Logical}.  The indexing @code{i} should generally have the same
length as @code{x}.  If it is shorter, then its elements will be
recycled as discussed in @ref{Elementary arithmetic operations}.  If it
is longer, then @code{x} is conceptually extended with @code{NA}s. The
selected values of @code{x} are those for which @code{i} is @code{TRUE}.
@c @findex TRUE
@c @findex FALSE

@cindex partial matching
@item
@strong{Character}.  The strings in @code{i} are matched against the
names attribute of @code{x} and the resulting integers are used.  For
@code{[[} and @code{$} partial matching is used if exact matching fails,
so @code{x$aa} will match @code{x$aabb} if @code{x} does not contain a component
named @code{"aa"} and @code{"aabb"} is the only name which has prefix
@code{"aa"}.  For @code{[[}, partial matching can be controlled via the
@code{exact} argument which defaults to @code{NA} indicating that
partial matching is allowed, but should result in a warning when it
occurs.  Setting @code{exact} to @code{TRUE} prevents partial matching
from occurring, a @code{FALSE} value allows it and does not issue any
warnings.  Note that @code{[} always requires an exact match.  The string
@code{""} is treated specially: it indicates `no name' and matches no
element (not even those without a name).  Note that partial matching is
only used when extracting and not when replacing.

@item
@strong{Factor}.  The result is identical to @code{x[as.integer(i)]}.
The factor levels are never used.  If so desired, use
@code{x[as.character(i)]} or a similar construction.

@item
@strong{Empty}.  The expression @code{x[]} returns @code{x}, but drops
``irrelevant'' attributes from the result.  Only @code{names} and in
multi-dimensional arrays @code{dim} and @code{dimnames} attributes are
retained.

@item
@strong{NULL}.  This is treated as if it were @code{integer(0)}.

@end itemize

Indexing with a missing (i.e.@: @code{NA}) value gives an @code{NA}
result.  This rule applies also to the case of logical indexing,
i.e.@: the elements of @code{x} that have an @code{NA} selector in
@code{i} get included in the result, but their value will be @code{NA}.
@findex NA

Notice however, that there are different modes of @code{NA}---the
literal constant is of mode @code{"logical"}, but it is frequently
automatically coerced to other types.  One effect of this is that
@code{x[NA]} has the length of @code{x}, but @code{x[c(1, NA)]} has
length 2.  That is because the rules for logical indices apply in the
former case, but those for integer indices in the latter.

Indexing with @code{[} will also carry out the relevant subsetting of
any names attributes.

@node Indexing matrices and arrays, Indexing other structures, Indexing by vectors, Indexing
@subsection Indexing matrices and arrays

@cindex index
Subsetting multi-dimensional structures generally follows the same rules
as single-dimensional indexing for each index variable, with the
relevant component of @code{dimnames} taking the place of @code{names}.
A couple of special rules apply, though:

Normally, a structure is accessed using the number of indices
corresponding to its dimension.  It is however also possible to use a
single index in which case the @code{dim} and @code{dimnames} attributes
are disregarded and the result is effectively that of @code{c(m)[i]}.
Notice that @code{m[1]} is usually very different from @code{m[1, ]} or
@code{m[, 1]}.

It is possible to use a matrix of integers as an index.  In this case,
the number of columns of the matrix should match the number of
dimensions of the structure, and the result will be a vector with length
as the number of rows of the matrix.  The following example shows how
to extract the elements @code{m[1, 1]} and @code{m[2, 2]} in one
operation.

@example
> m <- matrix(1:4, 2)
> m
     [,1] [,2]
[1,]    1    3
[2,]    2    4
> i <- matrix(c(1, 1, 2, 2), 2, byrow = TRUE)
> i
     [,1] [,2]
[1,]    1    1
[2,]    2    2
> m[i]
[1] 1 4
@end example

@noindent
Indexing matrices may not contain negative indices.  @code{NA} and
zero values are allowed: rows in an index matrix containing a zero are
ignored, whereas rows containing an @code{NA} produce an @code{NA} in
the result.

Both in the case of using a single
@cindex index
index and in matrix indexing, a @code{names} attribute is used if
present, as had the structure been one-dimensional.

If an indexing operation causes the result to have one of its extents of
length one, as in selecting a single slice of a three-dimensional matrix
with (say) @code{m[2, , ]}, the corresponding dimension is generally
dropped from the result.  If a single-dimensional structure results, a
vector is obtained.  This is occasionally undesirable and can be turned
off by adding the @samp{drop = FALSE} to the indexing operation.  Notice
that this is an additional argument to the @code{[} function and doesn't
add to the index count.  Hence the correct way of selecting the first
row of a matrix as a @math{1} by @math{n} matrix is @code{m[1, , drop =
FALSE]}.  Forgetting to disable the dropping feature is a common cause
of failure in general subroutines where an index occasionally, but not
usually has length one.  This rule still applies to a one-dimensional
array, where any subsetting will give a vector result unless @samp{drop
= FALSE} is used.

Notice that vectors are distinct from one-dimensional arrays in that the
latter have @code{dim} and @code{dimnames} attributes (both of length
one).  One-dimensional arrays are not easily obtained from subsetting
operations but they can be constructed explicitly and are returned by
@code{table}.  This is sometimes useful because the elements of the
@code{dimnames} list may themselves be named, which is not the case for
the @code{names} attribute.

Some operations such as @code{m[FALSE, ]} result in structures in which
a dimension has zero extent.  @R{} generally tries to handle these
structures sensibly.

@node Indexing other structures, Subset assignment, Indexing matrices and arrays, Indexing
@subsection Indexing other structures

The operator @code{[} is a generic function which allows class methods
to be added, and the @code{$} and @code{[[} operators likewise.  Thus,
it is possible to have user-defined indexing operations for any
structure.  Such a function, say @code{[.foo} is called with a set of
arguments of which the first is the structure being indexed and the rest
are the indices.  In the case of @code{$}, the index argument is of mode
@code{"symbol"} even when using the @code{x$"abc"} form.  It is
important to be aware that class methods do not necessarily behave in
the same way as the basic methods, for example with respect to partial
matching.

The most important example of a class method for @code{[} is that used
for data frames.  It is not described in detail here (see the help
page for @code{[.data.frame}), but in broad terms, if two indices are
supplied (even if one is empty) it creates matrix-like indexing for a
structure that is basically a list of vectors of the same length.  If a
single index is supplied, it is interpreted as indexing the list of
columns---in that case the @code{drop} argument is ignored, with a
warning.

The basic operators @code{$} and @code{[[} can be applied to
environments.  Only character indices are allowed and no partial
matching is done.


@node Subset assignment,  , Indexing other structures, Indexing
@subsection Subset assignment
@cindex assignment
@cindex complex assignment

Assignment to subsets of a structure is a special case of a general
mechanism for complex assignment:
@example
x[3:5] <- 13:15
@end example
The result of this command is as if the following had been executed
@example
`*tmp*` <- x
x <- "[<-"(`*tmp*`, 3:5, value=13:15)
rm(`*tmp*`)
@end example

Note that the index is first converted to a numeric index and then the
elements are replaced sequentially along the numeric index, as if a
@code{for} loop had been used.  Any existing variable called 
@code{`*tmp*`} will be overwritten and deleted, and this variable name 
should not be used in code.

The same mechanism can be applied to functions other than @code{[}.  The
replacement function has the same name with @code{<-} pasted on.  Its last
argument, which must be called @code{value}, is the new value to be
assigned.  For example,
@example
names(x) <- c("a","b")
@end example
is equivalent to
@example
`*tmp*` <- x
x <- "names<-"(`*tmp*`, value=c("a","b"))
rm(`*tmp*`)
@end example

Nesting of complex assignments is evaluated recursively
@example
names(x)[3] <- "Three"
@end example
is equivalent to
@example
`*tmp*` <- x
x <- "names<-"(`*tmp*`, value="[<-"(names(`*tmp*`), 3, value="Three"))
rm(`*tmp*`)
@end example



Complex assignments in the enclosing environment (using @code{<<-}) are
also permitted:
@example
names(x)[3] <<- "Three"
@end example
is equivalent to 
@example
`*tmp*` <<- get(x, envir=parent.env(), inherits=TRUE)
names(`*tmp*`)[3] <- "Three"
x <<- `*tmp*`
rm(`*tmp*`)
@end example
and also to
@example
`*tmp*` <- get(x,envir=parent.env(), inherits=TRUE)
x <<- "names<-"(`*tmp*`, value="[<-"(names(`*tmp*`), 3, value="Three"))
rm(`*tmp*`)
@end example

Only the target variable is evaluated in the enclosing environment, so 
@example
e<-c(a=1,b=2)
i<-1
local(@{
   e <- c(A=10,B=11)
   i <-2
   e[i] <<- e[i]+1
@})
@end example
uses the local value of @code{i} on both the LHS and RHS, and the local
value of @code{e} on the RHS of the superassignment statement.  It sets
@code{e} in the outer environment to
@example
 a  b 
 1 12
@end example
That is, the superassignment is equivalent to the four lines
@example
`*tmp*` <- get(e, envir=parent.env(), inherits=TRUE)
`*tmp*`[i] <- e[i]+1
e <<- `*tmp*`
rm(`*tmp*`)
@end example

Similarly
@example
x[is.na(x)] <<- 0
@end example
is equivalent to 
@example
`*tmp*` <- get(x,envir=parent.env(), inherits=TRUE)
`*tmp*`[is.na(x)] <- 0
x <<- `*tmp*`
rm(`*tmp*`)
@end example
and not to
@example
`*tmp*` <- get(x,envir=parent.env(), inherits=TRUE)
`*tmp*`[is.na(`*tmp*`)] <- 0
x <<- `*tmp*`
rm(`*tmp*`)
@end example
These two candidate interpretations differ only if there is also a
local variable @code{x}.  It is a good idea to avoid having a local
variable with the same name as the target variable of a
superassignment.  As this case was handled incorrectly in versions
1.9.1 and earlier there must not be a serious need for such code.



@c  Example session sketch
@c  @example

@c  Make some data
@c  > x <- rbinom(10,5,.5)
@c  > x
@c   [1] 3 2 3 0 1 1 0 4 3 1

@c  Select one element
@c  > x[6]
@c  [1] 1

@c  Select several
@c  > x[6:10]
@c  [1] 1 0 4 3 1

@c  Select by condition
@c  > x[x>=3]
@c  [1] 3 3 4 3

@c  ..by name (add element names first)
@c  > names(x)<-letters[1:10]
@c  > x
@c  a b c d e f g h i j
@c  3 2 3 0 1 1 0 4 3 1
@c  > x["e"]
@c  e
@c  1

@c  Notice that names vector is subsetted as well:
@c  > names(x[x>=3])
@c  [1] "a" "c" "h" "i"

@c  Indexing with [[ drops names attrib. whereas [ keeps (and subsets) it.
@c  > x[[4]]
@c  [1] 0
@c  > x[4]
@c  d
@c  0

@c  [[ also works on matrices
@c  > a<-matrix(1:4,2)
@c  > a[[2,2]]
@c  [1] 4

@c  However, one can not use fancy indexes:
@c  > x[[1:4]]
@c  Error: attempt to select more than one element

@c  [need examples of basic matrix operations, empty indexes, drop=TRUE/FALSE]
@c  @end example


@node Scope of variables,  , Indexing, Evaluation of expressions
@section Scope of variables
@cindex scope

@cindex name
Almost every programming language has a set of scoping rules, allowing
the same name to be used for different objects.  This allows, e.g., a
local variable in a function to have the same name as a global object.

@R{} uses a @emph{lexical scoping} model, similar to languages like
Pascal.  However, @R{} is a @emph{functional programming language} and
allows dynamic creation and manipulation of functions and language
objects, and has additional features reflecting this fact.

@menu
* Global environment::          
* Lexical environment::         
* Stacks::                      
* Search path::                 
@end menu

@node Global environment, Lexical environment, Scope of variables, Scope of variables
@subsection Global environment

The global
@cindex environment
environment is the root of the user workspace.  An
@cindex assignment
assignment operation from the command line will cause the relevant
object to belong to the global environment.  Its enclosing environment
is the next environment on the search path, and so on back to the
empty environment that is the enclosure of the base environment.

@node Lexical environment, Stacks, Global environment, Scope of variables
@subsection Lexical environment

Every call to a
@cindex function
function creates a
@cindex frame
@cindex environment
@emph{frame} which contains the local
variables created in the function, and is evaluated in an environment,
which in combination creates a new environment.

Notice the terminology: A frame is a set of variables, an environment is
a nesting of frames (or equivalently: the innermost frame plus the
enclosing environment).

Environments may be assigned to variables or be contained in other
objects.  However, notice that they are not standard objects---in
particular, they are not copied on assignment.

A closure (mode @code{"function"}) object will contain the environment
in which it is created as part of its definition (By default.  The
environment can be manipulated using @code{environment<-}).  When the
function is subsequently called, its 
@cindex environment, evaluation
evaluation environment is created with the closure's environment as
enclosure.  Notice that this is not
necessarily the environment of the caller!

Thus, when a variable is requested inside a
@cindex function
function, it is first sought
in the 
@cindex environment, evaluation
evaluation environment, then in the enclosure, the enclosure of
the enclosure, etc.; once the global environment or the environment of
a package is reached, the
search continues up the search path
to the environment of the base package.  If the variable is not
found there, the search will proceed next to the empty environment, and
will fail.

@node Stacks, Search path, Lexical environment, Scope of variables
@subsection The call stack

Every time a
@cindex function
function is invoked a new evaluation frame is created.  At
any point in time during the computation the currently active
environments are accessible through the @emph{call stack}.  Each time a
function is invoked a special construct called a context is created
internally and is placed on a list of contexts.  When a function has
finished evaluating its context is removed from the call stack.

Making variables defined higher up the call stack available is called
@cindex scope
dynamic scope. The binding for a variable is then determined by the most
recent (in time) definition of the variable.  This contradicts the
default scoping rules in @R{}, which use the bindings in the
@cindex environment
environment
in which the function was defined (lexical scope). Some functions,
particularly those that use and manipulate model formulas, need to
simulate dynamic scope by directly accessing the call stack.

Access to the
@cindex call stack
call stack is provided through a family of functions which
have names that start with @samp{sys.}.  They are listed briefly below.

@cindex evaluation
@table @code
@item sys.call
Get the call for the specified context.
@item sys.frame
Get the evaluation frame for the specified context.
@item sys.nframe
Get the environment frame for all active contexts.
@item sys.function
Get the function being invoked in the specified context.
@item sys.parent
Get the parent of the current function invocation.
@item sys.calls
Get the calls for all the active contexts.
@item sys.frames
Get the evaluation frames for all the active contexts.
@item sys.parents
Get the numeric labels for all active contexts.
@item sys.on.exit
Set a function to be executed when the specified context is exited.
@item sys.status
Calls @code{sys.frames}, @code{sys.parents} and @code{sys.calls}.
@item parent.frame
Get the evaluation frame for the specified parent context.
@end table

@node Search path,  , Stacks, Scope of variables
@subsection Search path

In addition to the evaluation
@cindex environment
@cindex search path
environment structure, @R{} has a search
path of environments which are searched for variables not found
elsewhere.  This is used for two things: packages of functions and
attached user data.

The first element of the search path is the global environment and the
last is the base package.  An @code{Autoloads} environment is used for
holding proxy objects that may be loaded on demand.  Other environments
are inserted in the path using @code{attach} or @code{library}.

@cindex namespace
Packages which have a @emph{namespace} have a different search path.
When a search for an @R{} object is started from an object in such a
package, the package itself is searched first, then its imports, then
the base namespace and finally the global environment and the rest of the
regular search path.  The effect is that references to other objects in
the same package will be resolved to the package, and objects cannot be
masked by objects of the same name in the global environment or in other
packages.


@node Functions, Object-oriented programming, Evaluation of expressions, Top
@chapter Functions

@menu
* Writing functions::           
* Functions as objects::        
* Evaluation::                  
@end menu

@node Writing functions, Functions as objects, Functions, Functions
@section Writing functions

While @R{} can be very useful as a data analysis tool most users very
quickly find themselves wanting to write their own
@cindex function
functions.  This is
one of the real advantages of @R{}.  Users can program it and they can,
if they want to, change the system level functions to functions that
they find more appropriate.

@R{} also provides facilities that make it easy to document any
functions that you have created.  @xref{Writing R documentation, , ,
R-exts, Writing R Extensions}.

@menu
* Syntax and examples::         
* Arguments::                   
@end menu

@node Syntax and examples, Arguments, Writing functions, Writing functions
@subsection Syntax and examples

The syntax for writing a
@cindex function
function is

@example
function ( @var{arglist} ) @var{body}
@end example

The first component of the function declaration is the keyword
@code{function} which indicates to @R{} that you want to create a
function.

An
@cindex argument
argument list is a comma separated list of formal arguments.  A
formal argument can be a symbol, a statement of the form
@samp{@var{symbol} = @var{expression}}, or the special formal argument
@code{...}.

The @emph{body} can be any valid @R{} expression.  Generally, the body
is a group of expressions contained in curly braces (@samp{@{} and
@samp{@}}).

Generally
@cindex function
functions are assigned to symbols but they don't need to be.
The value returned by the call to @code{function} is a function.  If
this is not given a name it is referred to as an
@cindex function, anonymous
anonymous
function. Anonymous functions are most frequently used as arguments to
other functions such as the @code{apply} family or @code{outer}.

Here is a simple function: @code{echo <- function(x) print(x)}.  So
@code{echo} is a function that takes a single argument and when
@code{echo} is invoked it prints its argument.

@node Arguments,  , Syntax and examples, Writing functions
@subsection Arguments

The formal arguments to the function define the variables whose values
will be supplied at the time the function is invoked.  The names of
these arguments can be used within the function body where they obtain
the value supplied at the time of function invocation.

@cindex argument, default values
Default values for arguments can be specified using the special form
@samp{@var{name} = @var{expression}}.  In this case, if the user does
not specify a value for the argument when the function is invoked the
expression will be associated with the corresponding symbol.  When a
value is needed the @var{expression} is
@cindex evaluation, expression
evaluated in the evaluation
frame of the function.

Default behaviours can also be specified by using the function
@code{missing}.  When @code{missing} is called with the
@cindex name
name of a formal
argument it returns @code{TRUE} if the formal argument was not matched
with any actual argument and has not been subsequently modified in the
body of the function.  An argument that is @code{missing} will thus
have its default value, if any. The @code{missing} function does not
force evaluation of the argument.

The special type of argument @code{...} can contain any number of
supplied arguments.  It is used for a variety of purposes.  It allows
you to write a
@cindex function
function that takes an arbitrary number of arguments.  It
can be used to absorb some arguments into an intermediate function which
can then be extracted by functions called subsequently.

@node Functions as objects, Evaluation, Writing functions, Functions
@section Functions as objects

Functions are first class objects in @R{}.  They can be used anywhere
that an @R{} object is required.  In particular they can be passed as
arguments to functions and returned as values from functions.  See 
@ref{Function objects} for the details.

@node Evaluation,  , Functions as objects, Functions
@section Evaluation

@menu
* Evaluation environment::      
* Argument matching::           
* Argument evaluation::         
* Scope::                       
@end menu

@node Evaluation environment, Argument matching, Evaluation, Evaluation
@subsection Evaluation environment

When a
@cindex function
function is called or invoked a new
@cindex evaluation
evaluation frame is created.
In this frame the formal arguments are matched with the supplied
arguments according to the rules given in @ref{Argument matching}.  The
statements in the body of the function are evaluated sequentially in
this
@cindex environment
environment frame.

The enclosing frame of the evaluation frame is the environment frame
associated with the function being invoked.  This may be different from
@Sl{}.  While many functions have @code{.GlobalEnv} as their environment
this does not have to be true and functions defined in packages with
namespaces (normally) have the package namespace as their environment.

@node Argument matching, Argument evaluation, Evaluation environment, Evaluation
@subsection Argument matching

This subsection applies to closures but not to primitive functions.  The
latter typically ignore tags and do positional matching, but their help
pages should be consulted for exceptions, which include @code{log},
@code{round}, @code{signif}, @code{rep} and @code{seq.int}.

The first thing that occurs in a
@cindex function
function evaluation is the matching of
formal to the actual or supplied arguments.
This is done by a three-pass process:

@enumerate

@item @strong{Exact matching on tags}.
@cindex name
For each named supplied argument the list of formal arguments is
searched for an item whose name matches exactly.  It is an error to have
the same formal argument match several actuals or vice versa.

@item @strong{Partial matching on tags}.
Each remaining named supplied argument is compared to the remaining formal
arguments using partial matching.  If the name of the supplied argument
matches exactly with the first part of a formal argument then the two
arguments are considered to be matched.  It is an error to have multiple
partial matches.  Notice that if @code{f <- function(fumble,
fooey) fbody}, then @code{f(f = 1, fo = 2)} is illegal, even though the
2nd actual argument only matches @code{fooey}.  @code{f(f = 1, fooey =
2)} @emph{is} legal though since the second argument matches exactly and
is removed from consideration for partial matching.  If the formal
arguments contain @code{...} then partial matching is only applied to
arguments that precede it.

@item @strong{Positional matching}.
Any unmatched formal arguments are bound to @emph{unnamed} supplied
arguments, in order.  If there is a @code{...} argument, it will take up
the remaining arguments, tagged or not.

@end enumerate

If any arguments remain unmatched an error is declared.

Argument matching is augmented by the functions @code{match.arg},
@code{match.call} and @code{match.fun}.
@findex match.arg
@findex match.call
@findex match.fun
Access to the partial matching algorithm used by @R{} is via
@code{pmatch}.

@node Argument evaluation, Scope, Argument matching, Evaluation
@subsection Argument evaluation

One of the most important things to know about the
@cindex evaluation, argument
evaluation of
arguments to a
@cindex function
function is that supplied arguments and default arguments
are treated differently.  The supplied arguments to a function are
evaluated in the evaluation frame of the calling function.  The default
arguments to a function are evaluated in the evaluation frame of the
function.

The semantics of invoking a function in @R{} argument are
@emph{call-by-value}.  In general, supplied arguments behave as if they
are local variables initialized with the value supplied and the
@cindex name
name of
the corresponding formal argument.  Changing the value of a supplied
argument within a function will not affect the value of the variable in
the calling frame.

@R{} has a form of lazy evaluation of function arguments.  Arguments are
not evaluated until needed.  It is important to realize that in some
cases the argument will never be evaluated.  Thus, it is bad style to
use arguments to functions to cause side-effects.  While in @C{} it is
common to use the form, @code{foo(x = y)} to invoke @code{foo} with the
value of @code{y} and simultaneously to assign the value of @code{y} to
@code{x} this same style should not be used in @R{}. There is no
guarantee that the argument will ever be evaluated and hence the
@cindex assignment
assignment may not take place.

It is also worth noting that the effect of @code{foo(x <- y)} if the
argument is evaluated is to change the value of @code{x} in the calling
@cindex environment
environment and not in the 
@cindex environment, evaluation
evaluation environment of @code{foo}.

It is possible to access the actual (not default) expressions used as
arguments inside the function.  The mechanism is implemented via
promises.  When a
@cindex function
function is being evaluated the actual expression used as an argument is
stored in the promise together with a pointer to the environment the
function was called from.  When (if) the argument is evaluated the
stored expression is evaluated in the environment that the function was
called from.  Since only a pointer to the environment is used any
changes made to that environment will be in effect during this
evaluation.  The resulting value is then also stored in a separate spot
in the promise.  Subsequent evaluations retrieve this stored value (a
second evaluation is not carried out).  Access to the unevaluated
expression is also available using @code{substitute}.
@c Because @R{} is a very
@c flexible program it is possible to encounter promises in the interpreted
@c language, however, users are advised not to rely on them in their own
@c programs.

When a
@cindex function
function is called, each formal argument is assigned a promise in the
local environment of the call with the expression slot containing the
actual argument (if it exists) and the environment slot containing the
environment of the caller.  If no actual argument for a formal argument
is given in the call and there is a default expression, it is similarly
assigned to the expression slot of the formal argument, but with the
@cindex environment
environment set
to the local environment.

The process of filling the value slot of a promise by
@cindex evaluation
evaluating the
contents of the expression slot in the promise's environment is called
@emph{forcing} the promise.  A promise will only be forced once, the
value slot content being used directly later on.

A promise is forced when its value is needed.  This usually happens
inside internal
@cindex function
@cindex function, internal
functions, but a promise can also be forced by direct evaluation of the
promise itself.  This is occasionally useful when a default expression
depends on the value of another formal argument or other variable in the
local environment.  This is seen in the following example where the lone
@code{label} ensures that the label is based on the value of @code{x}
before it is changed in the next line.

@example
function(x, label = deparse(x)) @{
    label
    x <- x + 1
    print(label)
@}
@end example

The expression slot of a promise can itself involve other promises.
This happens whenever an unevaluated argument is passed as an argument
to another function.  When forcing a promise, other promises in its
expression will also be forced recursively as they are evaluated.

@node Scope,  , Argument evaluation, Evaluation
@subsection Scope

@cindex scope
Scope or the scoping rules are simply the set of rules used by the
@cindex evaluation, symbol
evaluator to find a value for a
@cindex symbol
symbol.  Every computer language has a
set of such rules.  In @R{} the rules are fairly simple but there do
exist mechanisms for subverting the usual, or default rules.

@R{} adheres to a set of rules that are called @emph{lexical scope}.
This means the variable
@cindex binding
bindings in effect at the time the expression
was created are used to provide values for any unbound symbols in the
expression.

Most of the interesting properties of
@cindex scope
scope are involved with evaluating
@cindex function
functions and we concentrate on this issue.  A symbol can be either
@cindex binding
bound or unbound.  All of the formal arguments to a function provide
bound symbols in the body of the function.  Any other symbols in the
body of the function are either local variables or unbound variables.  A
local variable is one that is defined within the function.  Because @R{}
has no formal definition of variables, they are simply used as needed,
it can be difficult to determine whether a variable is local or not.
Local variables must first be defined, this is typically done by having
them on the left-hand side of an
@cindex assignment
assignment.

During the evaluation process if an unbound symbol is detected then @R{}
attempts to find a value for it.  The scoping rules determine how this
process proceeds.  In @R{} the
@cindex environment
environment of the function is searched
first, then its enclosure and so on until the global environment is reached.

The global environment heads a search list of environments that are searched
sequentially for a matching symbol.  The value of the first match is then used.

When this set of rules is combined with the fact that
@cindex function
functions can be
returned as values from other functions then some rather nice, but at
first glance peculiar, properties obtain.

A simple example:

@example
f <- function() @{
    y <- 10
    g <- function(x) x + y
    return(g)
@}
h <- f()
h(3)
@end example

@cindex evaluation
A rather interesting question is what happens when @code{h} is
evaluated. When a function body is evaluated there is no problem
determining values for local variables or for bound variables.  Scoping
rules determine how the language will find values for the unbound
variables.

When @code{h(3)} is evaluated we see that its body is that of
@code{g}. Within that body @code{x} is bound to the formal argument
and @code{y} is unbound.  In a language with
@cindex scope 
lexical scope @code{x} will be associated with the value 3 and
@code{y} with the value 10 local to @code{f} so @code{h(3)} should return the value 13.
In @R{} this is indeed what happens.

In @Sl{}, because of the different scoping rules one will get an error
indicating that @code{y} is not found, unless there is a variable
@code{y} in your workspace in which case its value will be used.

@c This is not correct!
@c The scoping rules in @Sl{} are to look in the current frame and then in
@c the global
@c @cindex environment
@c environment or workspace.  These rules are very similar to
@c the scoping rules used in the @code{C} language.

@c @node Closures,  , Evaluation, Functions
@c section Closures

@c A @emph{closure} is a
@c @cindex function
@c function together with an environment that
@c provides bindings for any free variables in the closure.  Since many
@c @R{} functions are bound to environments they are often referred to as
@c closures.

@c See also 'dot-dot-dot' above

@c  @node Miscellanea,  , Closures, Functions
@c  @section Miscellanea

@c  - g(...), ..1,

@c  - Recall()

@node Object-oriented programming, Computing on the language, Functions, Top
@chapter Object-oriented programming

@cindex object-oriented
Object-oriented programming is a style of programming that has become
popular in recent years.  Much of the popularity comes from the fact
that it makes it easier to write and maintain complicated systems.  It
does this through several different mechanisms.

Central to any object-oriented language are the concepts of class and of
methods.  A @emph{class} is a definition of an object.  Typically a
class contains several @emph{slots} that are used to hold class-specific
information.  An object in the language must be an instance of some
class.  Programming is based on objects or instances of classes.

Computations are carried out via @emph{methods}.  Methods are basically
@cindex function
functions that are specialized to carry out specific calculations on
objects, usually of a specific class.  This is what makes the language
object oriented.  In @R{}, @emph{generic functions} are used to
determine the appropriate method.  The generic function is responsible
for determining the class of its argument(s) and uses that information
to select the appropriate method.

Another feature of most object-oriented languages is the concept of
inheritance.  In most programming problems there are usually many
objects that are related to one another.  The programming is
considerably simplified if some components can be reused.

If a class inherits from another class then generally it gets all the
slots in the parent class and can extend it by adding new slots.  On
method dispatching (via the generic functions) if a method for the class
does not exist then a method for the parent is sought.

In this chapter we discuss how this general strategy has been
implemented in @R{} and discuss some of the limitations within the
current design.  One of the advantages that most object systems impart
is greater consistency.  This is achieved via the rules that are checked
by the compiler or interpreter.  Unfortunately because of the way that
the object system is incorporated into @R{} this advantage does not
obtain.  Users are cautioned to use the object system in a
straightforward manner.  While it is possible to perform some rather
interesting feats these tend to lead to obfuscated code and may depend
on implementation details that will not be carried forward.

The greatest use of object oriented programming in @R{} is through
@code{print} methods, @code{summary} methods and @code{plot} methods.
These methods allow us to have one generic
@cindex function, generic
function call, @code{plot}
say, that dispatches on the type of its argument and calls a plotting
function that is specific to the data supplied.

In order to make the concepts clear we will consider the implementation
of a small system designed to teach students about probability.  In this
system the objects are probability functions and the methods we will
consider are methods for finding moments and for plotting.
Probabilities can always be represented in terms of the cumulative
distribution function but can often be represented in other ways.  For
example as a density, when it exists or as a moment generating function
when it exists.

@c FIXME
@c This example needs help.  MGFs are not used at all, and neither are
@c the generic functions.  Also, note that the terminology `pdf' and
@c `cdf' may be confusing given the S use of `density' and `probability'
@c functions.
@c
@c  So we can begin by considering a system with three classes,
@c  @code{"cdf"}, @code{"pdf"} and @code{"mgf"} and three generic functions,
@c  @code{print}, @code{plot}, and @code{moment}.  Each of the classes can
@c  be extended in numerous ways; for example we might want a parametric
@c  representation for some of the more common distributions.
@c </FIXME>

@menu
* Definition::                  
* Inheritance::                 
* Method dispatching::          
* UseMethod::                   
* NextMethod::                  
* Group methods::               
* Writing methods::             
@end menu

@node Definition, Inheritance, Object-oriented programming, Object-oriented programming
@section Definition

Rather than having a full-fledged
@cindex object-oriented
object-oriented system @R{} has a
class system and a mechanism for dispatching based on the class of an
object.  The dispatch mechanism for interpreted code relies on four
special objects that are stored in the evaluation frame.  These special
objects are @code{.Generic}, @code{.Class}, @code{.Method} and
@code{.Group}.  There is a separate dispatch mechanism used for internal
functions and types that will be discussed elsewhere.

The class system is facilitated through the @code{class} attribute.
This attribute is a character vector of class names.  So to create an
object of class @code{"foo"} one simply attaches a class attribute with
the string @samp{"foo"} in it.  Thus, virtually anything can be turned
in to an object of class @code{"foo"}.

The object system makes use of
@cindex function, generic
@emph{generic functions} via two
dispatching functions, @code{UseMethod} and @code{NextMethod}.  The
typical use of the object system is to begin by calling a generic
function.  This is typically a very simple function and consists of a
single line of code.  The system function @code{mean} is just such a
function,

@example
> mean
function (x, ...)
UseMethod("mean")
@end example

When @code{mean} is called it can have any number of arguments but its
first argument is special and the class of that first argument is used
to determine which method should be called.  The variable @code{.Class}
is set to the class attribute of @code{x}, @code{.Generic} is set to the
string @code{"mean"} and a search is made for the correct method to
invoke.  The class attributes of any other arguments to @code{mean} are
ignored.

Suppose that @code{x} had a class attribute that contained @code{"foo"}
and @code{"bar"}, in that order.  Then @R{} would first search for a
function called @code{mean.foo} and if it did not find one it would then
search for a function @code{mean.bar} and if that search was also
unsuccessful then a final search for @code{mean.default} would be made.
If the last search is unsuccessful @R{} reports an error.  It is a good
idea to always write a default method.  Note that the functions
@code{mean.foo} etc.@: are referred to, in this context, as methods.

@code{NextMethod} provides another mechanism for dispatching.  A
@cindex function
function may have a call to @code{NextMethod} anywhere in it.  The
determination of which method should then be invoked is based primarily
on the current values of @code{.Class} and @code{.Generic}.  This is
somewhat problematic since the method is really an ordinary function and
users may call it directly.  If they do so then there will be no values
for @code{.Generic} or @code{.Class}.

If a method is invoked directly and it contains a call to
@code{NextMethod} then the first argument to @code{NextMethod} is used
to determine the
@cindex function, generic
generic function.  An error is signalled if this
argument has not been supplied; it is therefore a good idea to always
supply this argument.

In the case that a method is invoked directly the class attribute of the
first argument to the method is used as the value of @code{.Class}.

Methods themselves employ @code{NextMethod} to provide a form of
inheritance.  Commonly a specific method performs a few operations to
set up the data and then it calls the next appropriate method through a
call to @code{NextMethod}.

@c FIXME
@c See also further above.
@c We say that CDFs have three slots (perhaps should not used that
@c terminology), but in the example we simply add a class attribute to a
@c function, so where are the range and parameters?
@c
@c  Now let's consider the distribution function example.  We will assume
@c  that all objects of class @code{"cdf"} have three slots.  They will have
@c  a @emph{range} slot that specifies the range or support of the
@c  distribution, a @emph{parameters} slot that contains a tagged list of
@c  the parameters and finally a @emph{fun} slot that contains the actual
@c  cdf.  The @code{"pdf"} class will have the same three slots, however the
@c  function will be different.

@c  Suppose that we have the unit Exponential distribution.  The following
@c  code segment defines objects of class @code{"cdf"} and @code{"pdf"} that
@c  represent the cdf and pdf or the unit Exponential.

@c  @example
@c  > ucexp <- function(x) 1 - exp(-x)
@c  > class(ucexp) <- "cdf"
@c  > udexp <- function(x) exp(-x)
@c  > class(udexp) <- "pdf"
@c  @end example

@c  @noindent
@c  Note that the corresponding classes have no slots and that there was
@c  nothing, apart from common sense, that prevented us from making
@c  @code{udexp} have class @code{"cdf"}.
@c </FIXME>

Consider the following simple example.  A point in two-dimensional
Euclidean space can be specified by its Cartesian (x-y) or polar
(r-theta) coordinates.  Hence, to store information about the location
of the point, we could define two classes, @code{"xypoint"} and
@code{"rthetapoint"}.  All the `xypoint' data structures are lists with
an x-component and a y-component.  All `rthetapoint' objects are lists
with an r-component and a theta-component.

Now, suppose we want to get the x-position from either type of object.
This can easily be achieved through
@cindex function, generic
generic functions.  We define the
generic function @code{xpos} as follows.

@example
xpos <- function(x, ...)
    UseMethod("xpos")
@end example

@noindent
Now we can define methods:

@example
xpos.xypoint <- function(x) x$x
xpos.rthetapoint <- function(x) x$r * cos(x$theta)
@end example

The user simply calls the function @code{xpos} with either
representation as the argument.  The internal dispatching method finds
the class of the object and calls the appropriate methods.

It is pretty easy to add other representations.  One need not write a
new generic function only the methods.  This makes it easy to add to
existing systems since the user is only responsible for dealing with the
new representation and not with any of the existing representations.

The bulk of the uses of this methodology are to provide specialized
printing for objects of different types; there are about 40 methods for
@code{print}.

@node Inheritance, Method dispatching, Definition, Object-oriented programming
@section Inheritance

@cindex evaluation
The class attribute of an object can have several elements.  When a
@cindex function, generic
generic function is called the first inheritance is mainly handled
through @code{NextMethod}.  @code{NextMethod} determines the method
currently being evaluated, finds the next class from th

FIXME: something is missing here

@node Method dispatching, UseMethod, Inheritance, Object-oriented programming
@section Method dispatching

@cindex function, generic
Generic functions should consist of a single statement.  They should
usually be of the form @code{foo <- function(x, ...) UseMethod("foo",
x)}.  When @code{UseMethod} is called, it determines the appropriate 
method and then that method is invoked with the same arguments, in
the same order as the call to the generic, as if the call had been made
directly to the method.

In order to determine the correct method the class attribute of the
first argument to the generic is obtained and used to find the correct
method.  The
@cindex name
name of the generic function is combined with the first element of the
class attribute into the form, @code{@var{generic}.@var{class}} and a
function with that name is sought.  If the function is found then it is
used.  If no such function is found then the second element of the class
attribute is used, and so on until all the elements of the class
attribute have been exhausted.  If no method has been found at that
point then the method @code{@var{generic}.@var{default}} is used.  If
the first argument to the generic function has no class attribute then
@code{@var{generic}.@var{default}} is used.  Since the introduction of
namespaces the methods may not be accessible by their names
(i.e.@: @code{get("@var{generic}.@var{class}")} may fail), but they will
be accessible by @code{getS3method("@var{generic}","@var{class}")}.

@cindex object
Any object can have a @code{class} attribute.  This attribute can have
any number of elements.  Each of these is a string that defines a class.
When a generic function is invoked the class of its first argument is
examined.

@node UseMethod, NextMethod, Method dispatching, Object-oriented programming
@section UseMethod
@findex UseMethod

@code{UseMethod} is a special function and it behaves differently from
other function calls.  The syntax of a call to it is
@code{UseMethod(@var{generic}, @var{object})}, where @var{generic} is
the name of the generic function, @var{object} is the object used to
determine which method should be chosen.  @code{UseMethod} can only be
called from the body of a function.

@cindex evaluation
@code{UseMethod} changes the evaluation model in two ways.  First, when
it is invoked it determines the next method (function) to be called.  It
then invokes that function using the current evaluation
@cindex environment
environment; this process will be described shortly.  The second way in
which @code{UseMethod} changes the evaluation environment is that it
does not return control to the calling function.  This means, that any
statements after a call to @code{UseMethod} are guaranteed not to be
executed.

When @code{UseMethod} is invoked the generic function is the specified
value in the call to @code{UseMethod}.  The object to dispatch on is
either the supplied second argument or the first argument to the current
function.  The class of the argument is determined and the first element
of it is combined with the name of the generic to determine the
appropriate method.  So, if the generic had name @code{foo} and the
class of the object is @code{"bar"}, then @R{} will search for a method
named @code{foo.bar}.  If no such method exists then the inheritance
mechanism described above is used to locate an appropriate method.

Once a method has been determined @R{} invokes it in a special way.
Rather than creating a new evaluation
@cindex environment
environment @R{} uses the
environment of the current function call (the call to the generic).  Any
@cindex assignment
assignments or evaluations that were made before the call to
@code{UseMethod} will be in effect.  The arguments that were used in the
call to the generic are rematched to the formal arguments of the
selected method.

When the method is invoked it is called with arguments that are the same
in number and have the same names as in the call to the generic.  They
are matched to the arguments of the method according to the standard
@R{} rules for argument matching.  However the object, i.e.@: the first
argument has been evaluated.

The call to @code{UseMethod} has the effect of placing some special
objects in the evaluation frame.  They are @code{.Class},
@code{.Generic} and @code{.Method}.  These special objects are used to
by @R{} to handle the method dispatch and inheritance.  @code{.Class} is
the class of the object, @code{.Generic} is the name of the generic
function and @code{.Method} is the name of the method currently being
invoked.  If the method was invoked through one of the internal
interfaces then there may also be an object called @code{.Group}.  This
will be described in Section @ref{Group methods}.  After the initial
call to @code{UseMethod} these special variables, not the object itself,
control the selection of subsequent methods.

The body of the method is then evaluated in the standard fashion.  In
particular variable look-up in the body follows the rules for the
method.  So if the method has an associated environment then that is
used.  In effect we have replaced the call to the generic by a call to
the method.  Any local
@cindex assignment
assignments in the frame of the generic will be
carried forward into the call to the method.  Use of this @emph{feature}
is discouraged.  It is important to realize that control will never
return to the generic and hence any expressions after a call to
@code{UseMethod} will never be executed.

Any arguments to the generic that were evaluated prior to the call to
@code{UseMethod} remain evaluated.

If the first argument to @code{UseMethod} is not supplied it is assumed
to be the name of the current function.  If two arguments are supplied
to @code{UseMethod} then the first is the name of the method and the
second is assumed to be the object that will be dispatched on.  It is
evaluated so that the required method can be determined.  In this case
the first argument in the call to the generic is not evaluated and is
discarded.  There is no way to change the other arguments in the call to
the method; these remain as they were in the call to the generic.  This
is in contrast to @code{NextMethod} where the arguments in the call to
the next method can be altered.

@node NextMethod, Group methods, UseMethod, Object-oriented programming
@section NextMethod
@findex NextMethod

@code{NextMethod} is used to provide a simple inheritance mechanism.

Methods invoked as a result of a call to @code{NextMethod} behave as if
they had been invoked from the previous method.  The arguments to the
inherited method are in the same order and have the same names as the
call to the current method.  This means that they are the same as for
the call to the generic.  However, the expressions for the arguments are
the names of the corresponding formal arguments of the current method.
Thus the arguments will have values that correspond to their value at
the time NextMethod was invoked.

Unevaluated arguments remain unevaluated.  Missing arguments remain
missing.

The syntax for a call to @code{NextMethod} is @code{NextMethod(generic,
object, ...)}.  If the @code{generic} is not supplied the value of
@code{.Generic} is used.  If the @code{object} is not supplied the first
argument in the call to the current method is used.  Values in the
@code{...} argument are used to modify the arguments of the next method.

It is important to realize that the choice of the next method depends on
the current values of @code{.Generic} and @code{.Class} and not on the
object.  So changing the object in a call to @code{NextMethod} affects
the arguments received by the next method but does not affect the choice
of the next method.

Methods can be called directly.  If they are then there will be no
@code{.Generic}, @code{.Class} or @code{.Method}.  In this case the
@code{generic} argument of @code{NextMethod} must be specified.  The
value of @code{.Class} is taken to be the class attribute of the object
which is the first argument to the current function.  The value of
@code{.Method} is the name of the current function.  These choices for
default values ensure that the behaviour of a method doesn't change
depending on whether it is called directly or via a call to a generic.

@c FIXME

An issue for discussion is the behaviour of the @code{...} argument to
@code{NextMethod}.  The White Book describes the behaviour as follows:

@cindex name
- named arguments replace the corresponding arguments in the call to
  the current method.  Unnamed arguments go at the start of the argument
  list.

What I would like to do is:

-first do the argument matching for NextMethod;
  -if the object or generic are changed fine
  -first if a named list element matches an argument (named or not) the
  list value replaces the argument value.
  - the first unnamed list element

Values for lookup:
 Class: comes first from .Class, second from the first argument to the
 method and last from the object specified in the call to NextMethod

 Generic: comes first from .Generic, if nothing then from the first
 argument to the method and if it's still missing from the call to
 NextMethod

 Method: this should just be the current function name.

@c   I don't know
@c   what its used for but I don't currently think it's involved in the
@c   dispatch.

@c  @node Implicit dispatching, Group methods, NextMethod, Object-oriented programming
@c  @section Implicit dispatching

@c  What is implicit dispatching????

@node Group methods, Writing methods, NextMethod, Object-oriented programming
@section Group methods

For several types of
@cindex function, internal
internal functions @R{} provides a dispatching
mechanism for operators.  This means that operators such as @code{==} or
@code{<} can have their behaviour modified for members of special
classes.  The functions and operators have been grouped into three
categories and group methods can be written for each of these
categories.  There is currently no mechanism to add groups.  It is
possible to write methods specific to any function within a group.

The following table lists the functions for the different Groups.

@table @samp
@item Math
abs, acos, acosh, asin, asinh, atan, atanh, ceiling, cos, cosh, cospi, cumsum,
exp, floor, gamma, lgamma, log, log10, round, signif, sin, sinh, sinpi, 
tan, tanh, tanpi, trunc

@item Summary
all, any, max, min, prod, range, sum

@item Ops
@code{+}, @code{-}, @code{*}, @code{/}, @code{^}, @code{<} , @code{>},
@code{<=}, @code{>=}, @code{!=}, @code{==}, @code{%%}, @code{%/%},
@code{&}, @code{|}, @code{!}
@end table

For operators in the Ops group a special method is invoked if the two
operands taken together suggest a single method.  Specifically, if both
operands correspond to the same method or if one operand corresponds to
a method that takes precedence over that of the other operand.  If they
do not suggest a single method then the default method is used.  Either
a group method or a class method dominates if the other operand has no
corresponding method.  A class method dominates a group method.

When the group is Ops the special variable @code{.Method} is a string
vector with two elements.  The elements of @code{.Method} are set to the
name of the method if the corresponding argument is a member of the
class that was used to determine the method.  Otherwise the
corresponding element of @code{.Method} is set to the zero length
string, @code{""}.

@node Writing methods,  , Group methods, Object-oriented programming
@section Writing methods

Users can easily write their own methods and generic functions.  A
@cindex function, generic
generic function is simply a function with a call to @code{UseMethod}.
A method is simply a function that has been invoked via method dispatch.
This can be as a result of a call to either @code{UseMethod} or
@code{NextMethod}.

It is worth remembering that methods can be called directly.  That means
that they can be entered without a call to @code{UseMethod} having been
made and hence the special variables @code{.Generic}, @code{.Class} and
@code{.Method} will not have been instantiated.  In that case the
default rules detailed above will be used to determine these.

The most common use of
@cindex function, generic
generic functions is to provide @code{print} and
@code{summary} methods for statistical objects, generally the output of
some model fitting process.  To do this, each model attaches a class
attribute to its output and then provides a special method that takes
that output and provides a nice readable version of it.  The user then
needs only remember that @code{print} or @code{summary} will provide
nice output for the results of any analysis.

@c  @node Modeling functions, Graphics model, Object-oriented programming, Top
@c  @chapter Modeling functions

@c  @node Graphics model, Computing on the language, Modeling functions, Top
@c  @chapter Graphics model

@c  @menu
@c  * Math expressions in text::
@c  @end menu

@c  @node Math expressions in text,  , Graphics model, Graphics model
@c  @section Math expressions in text

@node Computing on the language, System and foreign language interfaces, Object-oriented programming, Top
@chapter Computing on the language

@R{} belongs to a class of programming languages in which subroutines
have the ability to modify or construct other subroutines and evaluate
the result as an integral part of the language itself.  This is similar
to Lisp and Scheme and other languages of the ``functional programming''
variety, but in contrast to FORTRAN and the ALGOL family.  The Lisp
family takes this feature to the extreme by the ``everything is a list''
paradigm in which there is no distinction between programs and data.

@R{} presents a friendlier interface to programming than Lisp does, at
least to someone used to mathematical formulas and C-like control
structures, but the engine is really very Lisp-like.  @R{} allows direct
access to
@cindex parsing
parsed expressions and functions and allows you to alter and
subsequently execute them, or create entirely new functions from
scratch.

There is a number of standard applications of this facility, such as
calculation of analytical derivatives of expressions, or the generation
of polynomial functions from a vector of coefficients.  However, there
are also uses that are much more fundamental to the workings of the
interpreted part of @R{}.  Some of these are essential to the reuse of
functions as components in other functions, as the (admittedly not very
pretty) calls to @code{model.frame} that are constructed in several
modeling and plotting routines.  Other uses simply allow elegant
interfaces to useful functionality.  As an example, consider the
@code{curve} function, which allows you to draw the graph of a function
given as an expression like @code{sin(x)} or the facilities for plotting
mathematical expressions.

In this chapter, we give an introduction to the set of facilities that
are available for computing on the language.

@menu
* Direct manipulation of language objects::  
* Substitutions::               
* More on evaluation::          
* Evaluation of expression objects::  
* Manipulation of function calls::  
* Manipulation of functions::   
@end menu

@node Direct manipulation of language objects, Substitutions, Computing on the language, Computing on the language
@section Direct manipulation of language objects

There are three kinds of language objects that are available for
modification, calls, expressions, and functions.  At this point, we
shall concentrate on the call objects.  These are sometimes referred to
as ``unevaluated expressions'', although this terminology is somewhat
confusing.  The most direct method of obtaining a call object is to use
@code{quote} with an expression argument, e.g.,

@example
> e1 <- quote(2 + 2)
> e2 <- quote(plot(x, y))
@end example

The arguments are not evaluated, the result is simply the parsed
argument.  The objects @code{e1} and @code{e2} may be evaluated later
using @code{eval}, or simply manipulated as data.  It is perhaps most
immediately obvious why the @code{e2} object has mode @code{"call"},
since it involves a call to the @code{plot} function with some
arguments.  However, @code{e1} actually has exactly the same structure
as a call to the binary operator @code{+} with two arguments, a fact
that gets clearly displayed by the following

@example
> quote("+"(2, 2))
2 + 2
@end example

The components of a call object are accessed using a list-like syntax,
and may in fact be converted to and from lists using @code{as.list} and
@code{as.call}
@c FIXME man page for as.call says that this doesn't work, but it
@c does...

@example
> e2[[1]]
plot
> e2[[2]]
x
> e2[[3]]
y
@end example

When keyword argument matching is used, the keywords can be used as list
tags:

@example
> e3 <- quote(plot(x = age, y = weight))
> e3$x
age
> e3$y
weight
@end example

All the components of the call object have mode @code{"name"} in the
preceding examples.  This is true for identifiers in calls, but the
components of a call can also be constants---which can be of any type,
although the first component had better be a function if the call is to
be evaluated successfully---or other call objects, corresponding to
subexpressions.  Objects of mode
@cindex name
name can be constructed from character
strings using @code{as.name}, so one might modify the @code{e2} object
as follows

@example
> e2[[1]] <- as.name("+")
> e2
x + y
@end example

To illustrate the fact that subexpressions are simply components that
are themselves calls, consider

@example
> e1[[2]] <- e2
> e1
x + y + 2
@end example


All grouping parentheses in input are preserved in parsed expressions.
They are represented as a function call with one argument, so that
@code{4 - (2 - 2)} becomes @code{"-"(4, "(" ("-"(2, 2)))} in prefix
notation.  In evaluations, the @samp{(} operator just returns its
argument.

This is a bit unfortunate, but it is not easy to write a
@cindex parsing
parser/deparser
combination that both preserves user input, stores it in minimal form
and ensures that parsing a deparsed expression gives the same expression
back.

As it happens, @R{}'s parser is not perfectly invertible, nor is its
deparser, as the following examples show

@example
> str(quote(c(1,2)))
 language c(1, 2)
> str(c(1,2))
 num [1:2] 1 2
> deparse(quote(c(1,2)))
[1] "c(1, 2)"
> deparse(c(1,2))
[1] "c(1, 2)"
> quote("-"(2, 2))
2 - 2
> quote(2 - 2)
2 - 2
@end example

@noindent
Deparsed expressions should, however, evaluate to an equivalent value
to the original expression (up to rounding error).

...internal storage of flow control constructs...note Splus
incompatibility...

@node Substitutions, More on evaluation, Direct manipulation of language objects, Computing on the language
@section Substitutions

It is in fact not often that one wants to modify the innards of an
expression like in the previous section.  More frequently, one wants to
simply get at an expression in order to deparse it and use it for
labeling plots, for instance.  An example of this is seen at the
beginning of @code{plot.default}:
@findex substitute

@example
xlabel <- if (!missing(x))
    deparse(substitute(x))
@end example

@noindent
This causes the variable or expression given as the @code{x} argument to
@code{plot} to be used for labeling the x-axis later on.

The function used to achieve this is @code{substitute} which takes the
expression @code{x} and substitutes the expression that was passed
through the formal argument @code{x}.  Notice that for this to happen,
@code{x} must carry information about the expression that creates its
value.  This is related to the
@cindex evaluation, lazy
lazy evaluation scheme of @R{}
(@pxref{Promise objects}).  A formal argument is really a
@emph{promise}, an object with three slots, one for the expression that
defines it, one for the environment in which to evaluate that expression,
and one for the value of that expression once evaluated. @code{substitute}
will recognize a promise variable and substitute the value of its
expression slot.  If @code{substitute} is invoked inside a function, the
local variables of the function are also subject to substitution.

The argument to @code{substitute} does not have to be a simple
identifier, it can be an expression involving several variables and
substitution will occur for each of these.  Also, @code{substitute} has
an additional argument which can be an environment or a list in which
the variables are looked up.  For example:

@example
> substitute(a + b, list(a = 1, b = quote(x)))
1 + x
@end example

Notice that quoting was necessary to substitute the @code{x}.  This kind
of construction comes in handy in connection with the facilities for
putting math expression in graphs, as the following case shows

@example
> plot(0)
> for (i in 1:4)
+   text(1, 0.2 * i,
+        substitute(x[ix] == y, list(ix = i, y = pnorm(i))))
@end example

It is important to realize that the substitutions are purely lexical;
there is no checking that the resulting call objects make sense if they
are evaluated.  @code{substitute(x <- x + 1, list(x = 2))} will happily
return @code{2 <- 2 + 1}.  However, some parts of @R{} make up their own
rules for what makes sense and what does not and might actually have a
use for such ill-formed expressions.  For example, using the ``math in
graphs'' feature often involves constructions that are syntactically
correct, but which would be meaningless to evaluate, like
@samp{@{@}>=40*" years"}.

Substitute will not evaluate its first argument.  This leads to the
puzzle of how to do substitutions on an object that is contained in a
variable.  The solution is to use @code{substitute} once more, like this

@example
> expr <- quote(x + y)
> substitute(substitute(e, list(x = 3)), list(e = expr))
substitute(x + y, list(x = 3))
> eval(substitute(substitute(e, list(x = 3)), list(e = expr)))
3 + y
@end example

The exact rules for substitutions are as follows:  Each
@cindex symbol
symbol in the
@cindex parsing
parse tree for the first is matched against the second argument, which
can be a tagged list or an environment frame.  If it is a simple local
object, its value is inserted, @emph{except} if matching against the
global environment.  If it is a promise (usually a function argument),
the promise expression is substituted.  If the symbol is not matched, it
is left untouched.  The special exception for substituting at the top
level is admittedly peculiar.  It has been inherited from @Sl{} and the
rationale is most likely that there is no control over which variables
might be bound at that level so that it would be better to just make
substitute act as @code{quote}.

The rule of promise substitution is slightly different from that of
@Sl{} if the local variable is modified before @code{substitute} is
used.  @R{} will then use the new value of the variable, whereas @Sl{}
will unconditionally use the argument expression---unless it was a
constant, which has the curious consequence that @code{f((1))} may be
very different from @code{f(1)} in @Sl{}.  The @R{} rule is considerably
cleaner, although it does have consequences in connection with
@cindex evaluation, lazy
lazy
evaluation that comes as a surprise to some.  Consider

@example
logplot <- function(y, ylab = deparse(substitute(y))) @{
    y <- log(y)
    plot(y, ylab = ylab)
@}
@end example

This looks straightforward, but one will discover that the y label
becomes an ugly @code{c(...)} expression.  It happens because the rules
of lazy evaluation cause the evaluation of the @code{ylab} expression
to happen @emph{after} @code{y} has been modified.  The solution is to
force @code{ylab} to be evaluated first, i.e.,

@example
logplot <- function(y, ylab = deparse(substitute(y))) @{
    ylab
    y <- log(y)
    plot(y, ylab = ylab)
@}
@end example

Notice that one should not use @code{eval(ylab)} in this situation.  If
@code{ylab} is a language or expression object, then that would cause
the object to be evaluated as well, which would not at all be desirable
if a math expression like @code{quote(log[e](y))} was being passed.


A variant on @code{substitute} is @code{bquote}, which is used to replace some subexpressions with their values.  The example from above
@example
> plot(0)
> for (i in 1:4)
+   text(1, 0.2 * i,
+        substitute(x[ix] == y, list(ix = i, y = pnorm(i))))
@end example
could be written more compactly as
@example
plot(0)
for(i in 1:4)
   text(1, 0.2*i, bquote( x[.(i)] == .(pnorm(i)) ))
@end example

The expression is quoted except for the contents of @code{.()}
subexpressions, which are replaced with their values. There is an
optional argument to compute the values in a different
environment. The syntax for @code{bquote} is borrowed from the LISP
backquote macro.

@node More on evaluation, Evaluation of expression objects, Substitutions, Computing on the language
@section More on evaluation

@cindex evaluation
The @code{eval} function was introduced earlier in this chapter as a
means of evaluating call objects.  However, this is not the full story.
It is also possible to specify the
@cindex environment
environment in which the evaluation
is to take place. By default this is the evaluation frame from which
@code{eval} is called, but quite frequently it needs to be set to
something else.
@findex eval

Very often, the relevant evaluation frame is that of the parent of the
current frame (cf.@: ???).  In particular, when the object to evaluate
is the result of a @code{substitute} operation of the function
arguments, it will contain variables that make sense to the caller only
(notice that there is no reason to expect that the variables of the
caller are in the
@cindex scope
lexical scope of the callee).  Since evaluation in the
parent frame occurs frequently, an @code{eval.parent} function exists as
a shorthand for @code{eval(expr, sys.frame(sys.parent()))}.

Another case that occurs frequently is evaluation in a list or a data
frame.  For instance, this happens in connection with the
@code{model.frame} function when a @code{data} argument is given.
Generally, the terms of the model formula need to be evaluated in
@code{data}, but they may occasionally also contain references to items
in the caller of @code{model.frame}.  This is sometimes useful in
connection with simulation studies.  So for this purpose one needs not
only to evaluate an expression in a list, but also to specify an
enclosure into which the search continues if the variable is not in the
list.  Hence, the call has the form

@example
eval(expr, data, sys.frame(sys.parent()))
@end example

Notice that evaluation in a given environment may actually change that
environment, most obviously in cases involving the
@cindex assignment
assignment operator,
such as

@example
eval(quote(total <- 0), environment(robert$balance)) # @r{rob Rob}
@end example

@noindent
This is also true when evaluating in lists, but the original list does
not change because one is really working on a copy.


@node Evaluation of expression objects, Manipulation of function calls, More on evaluation, Computing on the language
@section Evaluation of expression objects

Objects of mode @code{"expression"} are defined in @ref{Expression
objects}.  They are very similar to lists of call objects.

@example
> ex <- expression(2 + 2, 3 + 4)
> ex[[1]]
2 + 2
> ex[[2]]
3 + 4
> eval(ex)
[1] 7
@end example

Notice that evaluating an expression object evaluates each call in turn,
but the final value is that of the last call.  In this respect it
behaves almost identically to the compound language object
@code{quote(@{2 + 2; 3 + 4@})}.  However, there is a subtle difference:
Call objects are indistinguishable from subexpressions in a parse tree.
This means that they are automatically evaluated in the same way a
subexpression would be.  Expression objects can be recognized during
evaluation and in a sense retain their quotedness.  The evaluator will
not evaluate an expression object recursively, only when it is passed
directly to @code{eval} function as above.  The difference can be seen
like this:

@example
> eval(substitute(mode(x), list(x = quote(2 + 2))))
[1] "numeric"
> eval(substitute(mode(x), list(x = expression(2 + 2))))
[1] "expression"
@end example

The deparser represents an expression object by the call
that creates it.  This is similar to the way it handles numerical
vectors and several other objects that do not have a specific external
representation.  However, it does lead to the following bit of
confusion:

@example
> e <- quote(expression(2 + 2))
> e
expression(2 + 2)
> mode(e)
[1] "call"
> ee <- expression(2 + 2)
> ee
expression(2 + 2)
> mode(ee)
[1] "expression"
@end example

@noindent
I.e., @code{e} and @code{ee} look identical when printed, but one is a
call that generates an expression object and the other is the object
itself.

@node Manipulation of function calls, Manipulation of functions, Evaluation of expression objects, Computing on the language
@section Manipulation of function calls

It is possible for a
@cindex function
function to find out how it has been called by
looking at the result of @code{sys.call} as in the following example of
a function that simply returns its own call:

@example
> f <- function(x, y, ...) sys.call()
> f(y = 1, 2, z = 3, 4)
f(y = 1, 2, z = 3, 4)
@end example

However, this is not really useful except for debugging because it
requires the function to keep track of argument matching in order to
interpret the call.  For instance, it must be able to see that the 2nd
actual argument gets matched to the first formal one (@code{x} in the
above example).

More often one requires the call with all actual arguments bound to the
corresponding formals.  To this end, the function @code{match.call} is
used.  Here's a variant of the preceding example, a function that
returns its own call with arguments matched

@example
> f <- function(x, y, ...) match.call()
> f(y = 1, 2, z = 3, 4)
f(x = 2, y = 1, z = 3, 4)
@end example

Notice that the second argument now gets matched to @code{x} and appears
in the corresponding position in the result.

The primary use of this technique is to call another function with the
same arguments, possibly deleting some and adding others.  A typical
application is seen at the start of the @code{lm} function:

@example
    mf <- cl <- match.call()
    mf$singular.ok <- mf$model <- mf$method <- NULL
    mf$x <- mf$y <- mf$qr <- mf$contrasts <- NULL
    mf$drop.unused.levels <- TRUE
    mf[[1]] <- as.name("model.frame")
    mf <- eval(mf, sys.frame(sys.parent()))
@end example

Notice that the resulting call is
@cindex evaluation
evaluated in the parent frame, in
which one can be certain that the involved expressions make sense.  The
call can be treated as a list object where the first element is the name
of the function and the remaining elements are the actual argument
expressions, with the corresponding formal argument names as tags.
Thus, the technique to eliminate undesired arguments is to assign
@code{NULL}, as seen in lines 2 and 3, and to add an argument one uses
tagged list
@cindex assignment
assignment (here to pass @code{drop.unused.levels = TRUE})
as in line 4.  To change the name of the function called, assign to the
first element of the list and make sure that the value is a name, either
using the @code{as.name("model.frame")} construction here or
@code{quote(model.frame)}.

The @code{match.call} function has an @code{expand.dots} argument,
a switch which if set to @code{FALSE} lets all @code{...} arguments
be collected as a single argument with the tag @code{...}.
@findex match.call

@example
> f <- function(x, y, ...) match.call(expand.dots = FALSE)
> f(y = 1, 2, z = 3, 4)
f(x = 2, y = 1, ... = list(z = 3, 4))
@end example

The @code{...} argument is a list (a pairlist to be precise), not a call
to @code{list} like it is in @Sl{}:

@example
> e1 <- f(y = 1, 2, z = 3, 4)$...
> e1
$z
[1] 3

[[2]]
[1] 4
@end example

One reason for using this form of @code{match.call} is simply to get rid
of any @code{...} arguments in order not to be passing unspecified
arguments on to functions that may not know them.  Here's an example
paraphrased from @code{plot.formula}:

@example
m <- match.call(expand.dots = FALSE)
m$... <- NULL
m[[1]] <- "model.frame"
@end example

A more elaborate application is in @code{update.default} where a set of
optional extra arguments can add to, replace, or cancel those of the
original call:

@example
extras <- match.call(expand.dots = FALSE)$...
if (length(extras) > 0) @{
    existing <- !is.na(match(names(extras), names(call)))
    for (a in names(extras)[existing]) call[[a]] <- extras[[a]]
    if (any(!existing)) @{
        call <- c(as.list(call), extras[!existing])
        call <- as.call(call)
    @}
@}
@end example

Notice that care is taken to modify existing arguments individually in
case @code{extras[[a]] == NULL}.  Concatenation does not work on call
objects without the coercion as shown; this is arguably a bug.

Two further functions exist for the construction of function calls,
namely @code{call} and @code{do.call}.

The function @code{call} allows creation of a call object from the
function name and the list of arguments

@example
> x <- 10.5
> call("round", x)
round(10.5)
@end example

As seen, the value of @code{x} rather than the
@cindex symbol
symbol is inserted in the
call, so it is distinctly different from @code{round(x)}.  The form is
used rather rarely, but is occasionally useful where the name of a
function is available as a character variable.

The function @code{do.call} is related, but evaluates the call immediately
and takes the arguments from an object of mode @code{"list"} containing
all the arguments.  A natural use of this is when one wants to apply a
function like @code{cbind} to all elements of a list or data frame.
@findex do.call

@example
is.na.data.frame <- function (x) @{
    y <- do.call(cbind, lapply(x, is.na))
    rownames(y) <- row.names(x)
    y
@}
@end example

Other uses include variations over constructions like @code{do.call("f",
list(...))}.  However, one should be aware that this involves evaluation
of the arguments before the actual function call, which may defeat
aspects of lazy evaluation and argument substitution in the function
itself.  A similar remark applies to the @code{call} function.


@node Manipulation of functions,  , Manipulation of function calls, Computing on the language
@section Manipulation of functions

It is often useful to be able to manipulate the components of a
@cindex function
function
or closure.  @R{} provides a set of interface functions for this
purpose.

@ftable @code
@item body
Returns the expression that is the body of the function.
@item formals
Returns a list of the formal arguments to the function.  This is a
@code{pairlist}.
@item environment
@cindex environment
Returns the environment associated with the function.
@item body<-
This sets the body of the function to the supplied expression.
@item formals<-
Sets the formal arguments of the function to the supplied list.
@item environment<-
Sets the environment of the function to the specified environment.
@end ftable

It is also possible to alter the bindings of different variables in the
environment of the function, using code along the lines of @code{evalq(x
<- 5, environment(f))}.

It is also possible to convert a
@cindex function
function to a list using
@code{as.list}.  The result is the concatenation of the list of formal
arguments with the function body.  Conversely such a list can be
converted to a function using @code{as.function}.  This functionality is
mainly included for @Sl{} compatibility.  Notice that environment
information is lost when @code{as.list} is used, whereas
@code{as.function} has an argument that allows the environment to be
set.

@node System and foreign language interfaces, Exception handling, Computing on the language, Top
@chapter System and foreign language interfaces

@menu
* Operating system access::     
* Foreign language interfaces::  
* .Internal and .Primitive::    
@end menu

@node Operating system access, Foreign language interfaces, System and foreign language interfaces, System and foreign language interfaces
@section Operating system access

Access to the operating system shell is via the @R{} function
@code{system}.
@findex system
The details will differ by platform (see the on-line help), and about
all that can safely be assumed is that the first argument will be a
string @code{command} that will be passed for execution (not necessarily
by a shell) and the second argument will be @code{internal} which if
true will collect the output of the command into an @R{} character
vector.

The functions @code{system.time}
@findex system.time
and @code{proc.time}
@findex proc.time
are available for timing (although the information available may be
limited on non-Unix-like platforms).

Information from the operating system
@cindex environment
environment can be accessed and manipulated with
@quotation
@multitable @columnfractions 0.3 0.7
@item @code{Sys.getenv} @tab OS environment variables
@findex Sys.getenv
@item @code{Sys.putenv}                               
@findex Sys.putenv
@item @code{Sys.getlocale} @tab System locale         
@findex Sys.getlocale
@item @code{Sys.putlocale}                            
@findex Sys.putlocale
@item @code{Sys.localeconv}                           
@findex Sys.localeconv
@item @code{Sys.time} @tab Current time               
@findex Sys.time
@item @code{Sys.timezone} @tab Time zone              
@findex Sys.timezone
@end multitable
@end quotation


A uniform set of file access functions is provided on all platforms:
@quotation
@multitable @columnfractions 0.3 0.7
@item @code{file.access} @tab Ascertain File Accessibility 
@findex file.access
@item @code{file.append} @tab Concatenate files            
@findex file.append
@item @code{file.choose} @tab Prompt user for file name    
@findex file.choose
@item @code{file.copy}  @tab Copy files                    
@findex file.copy
@item @code{file.create} @tab Create or truncate a files   
@findex file.create
@item @code{file.exists} @tab Test for existence           
@findex file.exists
@item @code{file.info} @tab Miscellaneous file information 
@findex file.info
@item @code{file.remove} @tab remove files                 
@findex file.remove
@item @code{file.rename} @tab rename files                 
@findex file.rename
@item @code{file.show} @tab Display a text file            
@findex file.show
@item @code{unlink} @tab Remove files or directories.      
@findex unlink
@end multitable
@end quotation

There are also functions for manipulating file names and paths in a
platform-independent way.
@quotation
@multitable @columnfractions 0.3 0.7
@item @code{basename} @tab File name without directory     
@findex basename
@item @code{dirname} @tab Directory name                   
@findex dirname
@item @code{file.path} @tab Construct path to file         
@findex file.path
@item @code{path.expand} @tab Expand @code{~} in Unix path 
@findex path.expand
@end multitable
@end quotation

@node Foreign language interfaces, .Internal and .Primitive, Operating system access, System and foreign language interfaces
@section Foreign language interfaces
@findex .C
@findex .Fortran
@findex .Call
@findex .External

See @ref{System and foreign language interfaces, , , R-exts, Writing R
Extensions} for the details of adding functionality to @R{} via compiled
code.

Functions @code{.C} and @code{.Fortran} provide a standard interface to
compiled code that has been linked into @R{}, either at build time or
via @code{dyn.load}.  They are primarily intended for compiled @C{} and
FORTRAN code respectively, but the @code{.C} function can be used with
other languages which can generate C interfaces, for example C++.

Functions @code{.Call} and @code{.External} provide interfaces which allow
compiled code (primarily compiled @C{} code) to manipulate @R{} objects.

@node .Internal and .Primitive,  , Foreign language interfaces, System and foreign language interfaces
@section .Internal and .Primitive
@findex .Internal
@findex .Primitive

The @code{.Internal} and @code{.Primitive} interfaces are used to call
@C{} code compiled into @R{} at build time.
@xref{.Internal vs .Primitive, , , R-ints, R Internals}.


@node Exception handling, Debugging, System and foreign language interfaces, Top
@chapter Exception handling

The exception handling facilities in @R{} are provided through two
mechanisms.  Functions such as @code{stop} or @code{warning} can be
called directly or options such as @code{"warn"} can be used to control
the handling of problems.

@menu
* stop::                        
* warning::                     
* on.exit::                     
* Error options::               
@end menu

@node stop, warning, Exception handling, Exception handling
@section stop
@findex stop

A call to @code{stop} halts the evaluation of the current expression,
prints the message argument and returns execution to top-level.

@node warning, on.exit, stop, Exception handling
@section warning
@findex warning
@findex warnings

The function @code{warning} takes a single argument that is a character
string.  The behaviour of a call to @code{warning} depends on the value
of the option @code{"warn"}.  If @code{"warn"} is negative warnings are
ignored.  If it is zero, they are stored and printed after the top-level
function has completed.  If it is one, they are printed as they occur
and if it is 2 (or larger) warnings are turned into errors.

If @code{"warn"} is zero (the default), a variable @code{last.warning}
is created and the messages associated with each call to @code{warning}
are stored, sequentially, in this vector.  If there are fewer than 10
warnings they are printed after the function has finished evaluating.
If there are more than 10 then a message indicating how many warnings
occurred is printed.  In either case @code{last.warning} contains the
vector of messages, and @code{warnings} provides a way to access and
print it.

@node on.exit, Error options, warning, Exception handling
@section on.exit
@findex on.exit

A function can insert a call to @code{on.exit} at any point in the body
of a function.  The effect of a call to @code{on.exit} is to store the
value of the body so that it will be executed when the function exits.
This allows the function to change some system parameters and to ensure
that they are reset to appropriate values when the function is finished.
The @code{on.exit} is guaranteed to be executed when the function exits
either directly or as the result of a warning.

An error in the evaluation of the @code{on.exit} code causes an
immediate jump to top-level without further processing of the
@code{on.exit} code.

@code{on.exit} takes a single argument which is an expression to be
evaluated when the function is exited.

@c @node restart, Error options, on.exit, Exception handling
@c @section restart
@c @findex restart

@c A call to @code{restart} effectively makes the function a possible point
@c of return if an error occurs during the evaluation of that function (or
@c one of the functions it calls).

@c @code{restart} takes a single argument which is a logical variable.  If
@c the value of the logical is @code{TRUE} then a jump-point is
@c established.  If the value is @code{FALSE} then the jump-point is
@c removed.

@c When a jump is executed the jump-point is removed.

@c When an error occurs and one or more jump points are active then control
@c is returned to the innermost function that has a jump-point established.
@c Execution begins with the first statement in the body of the selected
@c function.  The
@c @cindex environment
@c environment for subsequent
@c @cindex evaluation
@c evaluation is the environment
@c that was in effect at the time that the error that triggered the jump
@c was signalled.

@node Error options,  , on.exit, Exception handling
@section Error options

There are a number of @code{options} variables that can be used to
control how @R{} handles errors and warnings.  They are listed in the
table below.

@table @samp
@item warn
Controls the printing of warnings.
@item warning.expression
Sets an expression that is to be evaluated when a warning occurs.  The
normal printing of warnings is suppressed if this option is set.
@item error
Installs an expression that will be evaluated when an error occurs.
The normal printing of error messages and warning messages precedes the
evaluation of the expression.
@end table

Expressions installed by @code{options("error")} are evaluated before
calls to @code{on.exit} are carried out.

One can use @code{options(error = expression(q("yes")))} to get @R{} to
quit when an error has been signalled.  In this case an error will cause
@R{} to shut down and the global environment will be saved.

@node Debugging, Parser, Exception handling, Top
@chapter Debugging

Debugging code has always been a bit of an art.  @R{} provides several
tools that help users find problems in their code.  These tools halt
execution at particular points in the code and the current state of the
computation can be inspected.

Most debugging takes place either through calls to @code{browser} or
@code{debug}.  Both of these functions rely on the same internal
mechanism and both provide the user with a special prompt.  Any command
can be typed at the prompt.  The evaluation
@cindex environment
environment for the command
is the currently active environment.  This allows you to examine the
current state of any variables etc.

There are five special commands that @R{} interprets differently.  They
are,

@table @samp
@item @key{RET}
Go to the next statement if the function is being debugged.  Continue
execution if the browser was invoked.
@item c
@itemx cont
Continue the execution.
@item n
Execute the next statement in the function.  This works from the browser
as well.
@item where
Show the call stack
@item Q
Halt execution and jump to the top-level immediately.
@end table

@cindex name
If there is a local variable with the same name as one of the special
commands listed above then its value can be accessed by using
@code{get}.  A call to @code{get} with the name in quotes will retrieve
the value in the current
@cindex environment
environment.

The debugger provides access only to interpreted expressions.  If a
function calls a foreign language (such as @C{}) then no access to the
statements in that language is provided.  Execution will halt on the
next statement that is evaluated in @R{}. A symbolic debugger such as
@code{gdb} can be used to debug compiled code.

@menu
* browser::                     
* debug/undebug::               
* trace/untrace::               
* traceback::                   
@end menu

@node browser, debug/undebug, Debugging, Debugging
@section browser
@findex browser

A call to the function @code{browser} causes @R{} to halt execution at
that point and to provide the user with a special prompt.  Arguments to
@code{browser} are ignored.

@example
> foo <- function(s) @{
+ c <- 3
+ browser()
+ @}
> foo(4)
Called from: foo(4)
Browse[1]> s
[1] 4
Browse[1]> get("c")
[1] 3
Browse[1]>
@end example

@node debug/undebug, trace/untrace, browser, Debugging
@section debug/undebug
@findex debug
@findex undebug

The debugger can be invoked on any function by using the command
@code{debug(@var{fun})}.  Subsequently, each time that function is
evaluated the debugger is invoked.  The debugger allows you to control
the evaluation of the statements in the body of the function.  Before
each statement is executed the statement is printed out and a special
prompt provided.  Any command can be given, those in the table above
have special meaning.

Debugging is turned off by a call to @code{undebug} with the function as
an argument.

@example
> debug(mean.default)
> mean(1:10)
debugging in: mean.default(1:10)
debug: @{
    if (na.rm)
        x <- x[!is.na(x)]
    trim <- trim[1]
    n <- length(c(x, recursive = TRUE))
    if (trim > 0) @{
        if (trim >= 0.5)
            return(median(x, na.rm = FALSE))
        lo <- floor(n * trim) + 1
        hi <- n + 1 - lo
        x <- sort(x, partial = unique(c(lo, hi)))[lo:hi]
        n <- hi - lo + 1
    @}
    sum(x)/n
@}
Browse[1]>
debug: if (na.rm) x <- x[!is.na(x)]
Browse[1]>
debug: trim <- trim[1]
Browse[1]>
debug: n <- length(c(x, recursive = TRUE))
Browse[1]> c
exiting from: mean.default(1:10)
[1] 5.5
@end example

@node trace/untrace, traceback, debug/undebug, Debugging
@section trace/untrace
@findex trace
@findex untrace

Another way of monitoring the behaviour of @R{} is through the
@code{trace} mechanism.  @code{trace} is called with a single argument
that is the name of the function you want to trace.  The name does not
need to be quoted but for some functions you will need to quote the name
in order to avoid a syntax error.

When @code{trace} has been invoked on a function then every time that
function is evaluated the call to it is printed out.  This mechanism is
removed by calling @code{untrace} with the function as an argument.

@example
> trace("[<-")
> x <- 1:10
> x[3] <- 4
trace: "[<-"(*tmp*, 3, value = 4)
@end example

@node traceback,  , trace/untrace, Debugging
@section traceback
@findex traceback

When an error has caused a jump to top-level a special variable called
@code{.Traceback} is placed into the base environment.
@code{.Traceback} is a character vector with one entry for each function
call that was active at the time the error occurred.  An examination of
@code{.Traceback} can be carried out by a call to @code{traceback}.

@node Parser, Function and Variable Index, Debugging, Top
@chapter Parser
@cindex parsing

The parser is what converts the textual representation of @R{} code into
an internal form which may then be passed to the @R{} evaluator which
causes the specified instructions to be carried out.  The internal form
is itself an @R{} object and can be saved and otherwise manipulated
within the @R{} system.

@menu
* The parsing process::         
* Comments::                    
* Tokens::                      
* Expressions::                 
* Directives::                  
@end menu

@node The parsing process, Comments, Parser, Parser
@comment  node-name,  next,  previous,  up
@section The parsing process

@menu
* Modes of parsing::            
* Internal representation::     
* Deparsing::                   
@end menu

@node Modes of parsing, Internal representation, The parsing process, The parsing process
@comment  node-name,  next,  previous,  up
@subsection Modes of parsing

Parsing in @R{} occurs in three different variants:

@itemize @bullet
@item The read-eval-print loop
@item Parsing of text files
@item Parsing of character strings
@end itemize

The read-eval-print loop forms the basic command line interface to @R{}.
Textual input is read until a complete @R{} expression is available.
Expressions may be split over several input lines.  The primary prompt
(by default @samp{> }) indicates that the parser is ready for a new
expression, and a continuation prompt (by default @samp{+ }) indicates
that the parser expects the remainder of an incomplete expression.  The
expression is converted to internal form during input and the parsed
expression is passed to the evaluator and the result is printed (unless
specifically made invisible).  If the parser finds itself in a state
which is incompatible with the language syntax, a ``Syntax Error'' is
flagged and the parser resets itself and resumes input at the beginning
of the next input line.

Text files can be parsed using the @code{parse} function.  In
particular, this is done during execution of the @code{source}
function, which allows commands to be stored in an external file and
executed as if they had been typed at the keyboard.  Note, though, that
the entire file is parsed and syntax checked before any evaluation takes
place.

Character strings, or vectors thereof, can be parsed using the
@code{text=} argument to @code{parse}.  The strings are treated exactly
as if they were the lines of an input file.

@node Internal representation, Deparsing, Modes of parsing, The parsing process
@comment  node-name,  next,  previous,  up
@subsection Internal representation

@cindex parsing
Parsed expressions are stored in an @R{} object containing the parse
tree.  A fuller description of such objects can be found in
@ref{Language objects} and @ref{Expression objects}.  Briefly, every
elementary @R{} expression is stored in
@cindex function
function call form, as a list
with the first element containing the function name and the remainder
containing the arguments, which may in turn be further @R{} expressions.
The list elements can be named, corresponding to tagged matching of
formal and actual arguments.  Note that @emph{all} @R{} syntax elements
are treated in this way, e.g.@: the assignment @code{x <- 1} is encoded
as @code{"<-"(x, 1)}.

@node Deparsing,  , Internal representation, The parsing process
@comment  node-name,  next,  previous,  up
@subsection Deparsing

Any @R{} object can be converted to an @R{} expression using
@code{deparse}.  This is frequently used in connection with output of
results, e.g.@: for labeling plots.  Notice that only objects of mode
@code{"expression"} can be expected to be unchanged by reparsing the
output of deparsing.  For instance, the numeric vector @code{1:5} will
deparse as @code{"c(1, 2, 3, 4, 5)"}, which will reparse as a call to
the function @code{c}.  As far as possible, evaluating the deparsed and
reparsed expression gives the same result as evaluating the original,
but there are a couple of awkward exceptions, mostly involving
expressions that weren't generated from a textual representation in the
first place.

@node Comments, Tokens, The parsing process, Parser
@comment  node-name,  next,  previous,  up
@section Comments

@cindex comments
Comments in @R{} are ignored by the parser.  Any text from a
@findex #
@code{#} character
to the end of the line is taken to be a comment, unless
the @code{#} character is inside a quoted string. For example,

@example
> x <- 1  # This is a comment...
> y <- "  #... but this is not."
@end example

@node Tokens, Expressions, Comments, Parser
@comment  node-name,  next,  previous,  up
@section Tokens

Tokens are the elementary building blocks of a programming language.
They are recognised during @emph{lexical analysis} which (conceptually,
at least) takes place prior to the syntactic analysis performed by the
parser itself.

@menu
* Literal constants::           
* Identifiers::                 
* Reserved words::              
* Special operators::           
* Separators::                  
* Operator tokens::             
* Grouping::                    
* Indexing tokens::             
@end menu

@node Literal constants, Identifiers, Tokens, Tokens
@comment  node-name,  next,  previous,  up
@subsection Constants

There are five types of constants: integer, logical, numeric, complex and string.

In addition, there are four special constants, @code{NULL}, @code{NA},
@code{Inf}, and @code{NaN}.

@code{NULL} is used to indicate the empty object.  @code{NA} is used for
absent (``Not Available'') data values.  @code{Inf} denotes infinity and
@code{NaN} is not-a-number in the @acronym{IEEE} floating point calculus
(results of the operations respectively @math{1/0} and @math{0/0}, for
instance).

Logical constants are either @code{TRUE} or @code{FALSE}.

Numeric constants follow a similar syntax to that of the @C{} language.
They consist of an integer part consisting of zero or more digits,
followed optionally by @samp{.} and a fractional part of zero or more
digits optionally followed by an exponent part consisting of an @samp{E}
or an @samp{e}, an optional sign and a string of one or more digits.
Either the fractional or the decimal part can be empty, but not both at
once.

@example
@r{Valid numeric constants:} 1 10 0.1 .2 1e-7 1.2e+7
@end example

Numeric constants can also be hexadecimal, starting with @samp{0x} or
@samp{0x} followed by zero or more digits, @samp{a-f} or @samp{A-F}.  
Hexadecimal floating point constants are supported using C99 syntax, e.g.
@samp{0x1.1p1}.

There is now a separate class of integer constants.  They are created
by using the qualifier @code{L} at the end of the number.  For
example, @code{123L} gives an integer value rather than a numeric
value.  The suffix @code{L} can be used to qualify any non-complex
number with the intent of creating an integer.  So it can be used with
numbers given by hexadecimal or scientific notation. However, if the
value is not a valid integer, a warning is emitted and the numeric
value created.  The following shows examples of valid integer
constants, values which will generate a warning and give numeric
constants and syntax errors.

@example
@r{Valid integer constants:}  1L, 0x10L, 1000000L, 1e6L
@r{Valid numeric constants:}  1.1L, 1e-3L, 0x1.1p-2
@r{Syntax error:}  12iL 0x1.1
@end example

A warning is emitted for decimal values that contain an unnecessary
decimal point, e.g.@: @code{1.L}.  It is an error to have a decimal
point in a hexadecimal constant without the binary exponent.

Note also that a preceding sign (@code{+} or @code{-}) is treated as a
unary operator, not as part of the constant.

Up-to-date information on the currently accepted formats can be found by
@code{?NumericConstants}.

Complex constants have the form of a decimal numeric constant followed
by @samp{i}.  Notice that only purely imaginary numbers are actual
constants, other complex numbers are parsed a unary or binary operations
on numeric and imaginary numbers.

@example
@r{Valid complex constants:} 2i 4.1i 1e-2i
@end example

String constants are delimited by a pair of single (@samp{'}) or double
(@samp{"}) quotes and can contain all other printable characters.
Quotes and other special characters within strings are specified using
@emph{escape sequences}:

@table @code
@item \'
single quote
@item \"
double quote
@item \n
newline (aka `line feed', @key{LF})
@item \r
carriage return (@key{CR})
@item \t
tab character
@item \b
backspace
@item \a
bell
@item \f
form feed
@item \v
vertical tab
@item \\
backslash itself
@item \@var{nnn}
character with given octal code -- sequences of one, two or three digits
in the range @code{0 ... 7} are accepted.
@item \x@var{nn}
character with given hex code -- sequences of one or two hex digits
(with entries @code{0 ... 9 A ... F a ... f}).
@item \u@var{nnnn} \u@{@var{nnnn}@}
(where multibyte locales are supported, otherwise an error).
Unicode character with given hex code -- sequences of up to four hex
digits. The character needs to be valid in the current locale.
@item \U@var{nnnnnnnn} \U@{@var{nnnnnnnn}@}
(where multibyte locales are supported, otherwise an
error).  Unicode character with given hex code -- sequences of up to
eight hex digits.
@end table

@noindent
A single quote may also be embedded directly in a double-quote delimited
string and vice versa.

A `nul' (@code{\0}) is not allowed in a character string, so using
@code{\0} in a string constant terminates the constant (usually with a
warning): further characters up to the closing quote are scanned but
ignored.

@node Identifiers, Reserved words, Literal constants, Tokens
@subsection Identifiers

@cindex identifier
Identifiers consist of a sequence of letters, digits, the period
(@samp{.}) and the underscore.  They must not start with a digit or
an underscore, or with a period followed by a digit.

The definition of a letter depends on the current locale: the precise
set of characters allowed is given by the C expression @code{(isalnum(c)
|| c == '.' || c == '_')} and will include accented letters in many
Western European locales.

Notice that identifiers starting with a period are not by default listed
by the @code{ls} function and that @code{...} and @code{..1},
@code{..2}, etc.@: are special.

Notice also that objects can have names that are not identifiers.  These
are generally accessed via @code{get} and @code{assign}, although they
can also be represented by text strings in some limited circumstances
when there is no ambiguity (e.g.@: @code{"x" <- 1}). As @code{get} and
@code{assign} are not restricted to names that are identifiers they do
not recognise subscripting operators or replacement functions. The
following pairs are @emph{not} equivalent
@findex get
@findex assign

@quotation
@multitable {@code{names(x)<-nm}} {@code{assign("names(x)",nm)}}
@item @code{x$a<-1} @tab @code{assign("x$a",1)}
@item @code{x[[1]]} @tab @code{get("x[[1]]")}
@item @code{names(x)<-nm} @tab @code{assign("names(x)",nm)}
@end multitable
@end quotation

@node Reserved words, Special operators, Identifiers, Tokens
@subsection Reserved words

The following identifiers have a special meaning and cannot be used
for object names

@example
if else repeat while function for in next break
TRUE FALSE NULL Inf NaN
NA NA_integer_ NA_real_ NA_complex_ NA_character_
... ..1 ..2 @r{etc.}
@end example

@node Special operators, Separators, Reserved words, Tokens
@subsection Special operators

@R{} allows user-defined infix operators.  These have the form of a
string of characters delimited by the @samp{%} character.  The string
can contain any printable character except @samp{%}.  The escape sequences
for strings do not apply here.

Note that the following operators are predefined

@example
%% %*% %/% %in% %o% %x%
@end example

@c  @node Special symbols, Separators, Special operators, Tokens
@c  @subsection Special symbols

@c  @c (I can't for the life of me remember what I intended here... -pd)
@c  .....possibly  "..." and friends which are currently "reserved
@c  words"
@c FIXME: get this clarified

@node Separators, Operator tokens, Special operators, Tokens
@subsection Separators

Although not strictly tokens, stretches of whitespace characters
(spaces, tabs and formfeeds, on Windows and UTF-8 locales other Unicode
whitespace characters@footnote{such as @code{U+A0}, non-breaking space,
and @code{U+3000}, ideographic space.}) serve to delimit tokens in case of
ambiguity, (compare @code{x<-5} and @code{x < -5}).


Newlines have a function which is a combination of token separator and
expression terminator.  If an expression can terminate at the end of
the line the parser will assume it does so, otherwise the newline is
treated as whitespace.  Semicolons (@samp{;}) may be used to separate
elementary 
@cindex expression
expressions on the same line.


Special rules apply to the @code{else} keyword: inside a compound
expression, a newline before @code{else} is discarded, whereas at the
outermost level, the newline terminates the @code{if} construction and a
subsequent @code{else} causes a syntax error.  This somewhat anomalous
behaviour occurs because @R{} should be usable in interactive mode and
then it must decide whether the input expression is complete,
incomplete, or invalid as soon as the user presses @key{RET}.

The comma (@samp{,}) is used to separate function arguments and multiple
indices.

@node Operator tokens, Grouping, Separators, Tokens
@subsection Operator tokens

@R{} uses the following operator tokens

@quotation
@multitable @columnfractions 0.3 0.6
@item @code{+ - * / %% ^} @tab arithmetic
@item @code{> >= < <= == !=} @tab relational
@item @code{! & |} @tab logical
@item @code{~} @tab model formulae
@item @code{-> <-} @tab assignment
@item @code{$} @tab list indexing
@item @code{:} @tab sequence
@end multitable
@end quotation

@noindent
(Several of the operators have different meaning inside model formulas)

@node Grouping, Indexing tokens, Operator tokens, Tokens
@subsection Grouping

Ordinary parentheses---@samp{(} and @samp{)}---are used for explicit
grouping within expressions and to delimit the argument lists for
function definitions and function calls.

Braces---@samp{@{} and @samp{@}}---delimit blocks of expressions in
function definitions, conditional expressions, and iterative constructs.

@node Indexing tokens,  , Grouping, Tokens
@subsection Indexing tokens

Indexing of arrays and vectors is performed using the single and double
brackets, @samp{[]} and @samp{[[]]}.  Also, indexing tagged lists
may be done using the @samp{$} operator.

@c ------end of  @section Tokens ------------

@node Expressions, Directives, Tokens, Parser
@section Expressions

An @R{} program consists of a sequence of @R{} expressions.  An
expression can be a simple expression consisting of only a constant or
an identifier, or it can be a compound expression constructed from other
parts (which may themselves be expressions).

The following sections detail the various syntactical constructs that
are available.

@menu
* Function calls (expressions)::  
* Infix and prefix operators::  
* Index constructions::         
* Compound expressions::        
* Flow control elements::       
* Function definitions::        
@end menu

@c  need "(expressions)" or something to differentiate from node
@c  "Function calls" (way) above :

@node Function calls (expressions), Infix and prefix operators, Expressions, Expressions
@subsection Function calls

@cindex function
A function call takes the form of a function reference followed by a
comma-separated list of arguments within a set of parentheses.

@example
@var{function_reference} ( @var{arg1}, @var{arg2}, ...... , @var{argn} )
@end example

The function reference can be either
@itemize @bullet
@item
an identifier (the name of the function)
@item
a text string (ditto, but handy if the function has a name which is not
a valid identifier)
@item
an expression (which should evaluate to a function object)
@end itemize

Each argument can be tagged (@code{@var{tag}=@var{expr}}), or just be a
simple expression.  It can also be empty or it can be one of the special
tokens @code{...}, @code{..2}, etc.

A tag can be an identifier or a text string.

Examples:

@example
f(x)
g(tag = value, , 5)
"odd name"("strange tag" = 5, y)
(function(x) x^2)(5)
@end example

@node Infix and prefix operators, Index constructions, Function calls (expressions), Expressions
@subsection Infix and prefix operators

The order of precedence (highest first) of the operators is

@example
::
$ @@
^
- +                @r{(unary)}
:
%@var{xyz}% |>
* /
+ -                @r{(binary)}
> >= < <= == !=
!
& &&
| ||
~                  @r{(unary and binary)}
-> ->>
<- <<-
=                  @r{(as assignment)}
@end example
Note that @code{:} precedes binary +/-, but not @code{^}. Hence,
@code{1:3-1} is @math{0 1 2}, but @code{1:2^3} is @code{1:8}. 

The exponentiation operator @samp{^} and the
@cindex assignment
left assignment plus minus operators
@samp{<- - = <<-} group right to left, all other operators group left to
right.  That is, @code{2 ^ 2 ^ 3} is @math{2 ^ 8}, not @math{4 ^ 3},
whereas @code{1 - 1 - 1} is @math{-1}, not 1.

Notice that the operators @code{%%} and @code{%/%} for integer
remainder and divide have higher precedence than multiply and divide.

Although it is not strictly an operator, it also needs mentioning that
the @samp{=} sign is used for tagging arguments in
function calls and
for assigning default values in function definitions.

The @samp{$} sign is in some sense an operator, but does not allow
arbitrary right hand sides and is discussed under @ref{Index
constructions}.  It has higher precedence than any of the other
operators.

The parsed form of a unary or binary operation is completely equivalent
to a function call with the operator as the function name and the
operands as the function arguments.

Parentheses are recorded as equivalent to a unary operator, with name
@code{"("}, even in cases where the parentheses could be inferred from
operator precedence (e.g., @code{a * (b + c)}).
@c FIXME: Will this get changed?

Notice that the
@cindex assignment
assignment symbols are operators just like the arithmetic, relational,
and logical ones.  Any expression is allowed also on the target side of
an assignment, as far as the parser is concerned (@code{2 + 2 <- 5} is a
valid expression as far as the parser is concerned.  The evaluator will
object, though).  Similar comments apply to the model formula operator.

@node Index constructions, Compound expressions, Infix and prefix operators, Expressions
@subsection Index constructions

@R{} has three indexing constructs, two of which are syntactically
similar although with somewhat different semantics:

@example
@var{object} [ @var{arg1}, ...... , @var{argn} ]
@var{object} [[ @var{arg1}, ...... , @var{argn} ]]
@end example
@findex [
@findex [[

The @var{object} can formally be any valid expression, but it is
understood to denote or evaluate to a subsettable object.  The arguments
generally evaluate to numerical or character indices, but other kinds of
arguments are possible (notably @code{drop = FALSE}).

Internally, these index constructs are stored as function calls with
function name @code{"["} respectively @code{"[["}.

The third index construction is

@example
@var{object} $ @var{tag}
@end example
@findex $

Here, @var{object} is as above, whereas @var{tag} is an identifier or a
text string.  Internally, it is stored as a function call with name
@code{"$"}

@c  @node Assignments, Model formulae, Index constructions, Expressions
@c  @subsection Assignments

@c  @node Model formulae, Flow control elements, Assignments, Expressions
@c  @subsection Model formulae

@node Compound expressions, Flow control elements, Index constructions, Expressions
@subsection Compound expressions

A compound expression is of the form

@example
@{ @var{expr1} ; @var{expr2} ; ...... ; @var{exprn} @}
@end example

The semicolons may be replaced by newlines.  Internally, this is stored
as a function call with @code{"@{"} as the function name and the
expressions as arguments.

@node Flow control elements, Function definitions, Compound expressions, Expressions
@subsection Flow control elements

@R{} contains the following control structures as special syntactic
constructs

@example
if ( @var{cond} ) @var{expr}
if ( @var{cond} ) @var{expr1} else @var{expr2}
while ( @var{cond} ) @var{expr}
repeat @var{expr}
for ( @var{var} in @var{list} ) @var{expr}
@end example

The expressions in these constructs will typically be compound
expressions.

Within the loop constructs (@code{while}, @code{repeat}, @code{for}),
one may use @code{break} (to terminate the loop) and @code{next} (to
skip to the next iteration).

Internally, the constructs are stored as function calls:

@example
"if"(@var{cond}, @var{expr})
"if"(@var{cond}, @var{expr1}, @var{expr2})
"while"(@var{cond}, @var{expr})
"repeat"(@var{expr})
"for"(@var{var}, @var{list}, @var{expr})
"break"()
"next"()
@end example

@node Function definitions,  , Flow control elements, Expressions
@subsection Function definitions

A
@cindex function
function definition is of the form

@example
function ( @var{arglist} ) @var{body}
@end example

The function body is an expression, often a compound expression.  The
@var{arglist} is a comma-separated list of items each of which can be an
identifier, or of the form @samp{@var{identifier} = @var{default}}, or
the special token @code{...}.  The @var{default} can be any valid
expression.

Notice that function arguments unlike list tags, etc., cannot have
``strange names'' given as text strings.
@c FIXME: is there a good reason for this?

Internally, a function definition is stored as a function call with
function name @code{function} and two arguments, the @var{arglist} and
the @var{body}.  The @var{arglist} is stored as a tagged pairlist where
the tags are the argument names and the values are the default
expressions.

@node Directives,  , Expressions, Parser
@section Directives

@cindex #line

The parser currently only supports one directive, @code{#line}.  
This is similar to the C-preprocessor directive of the same name.  The
syntax is

@example
@var{#line} @var{nn} [ @code{"filename"} ]
@end example

where @var{nn} is an integer line number, and the optional @var{filename} 
(in required double quotes) names the source file.

Unlike the C directive, @code{#line} must appear as the first five characters
on a line.  As in C, @var{nn} and @code{"filename"} entries may be separated
from it by whitespace.  And unlike C, any following text on the line will be
treated as a comment and ignored.

This directive tells the parser that the following line should be assumed to 
be line @var{nn} of file @var{filename}.  (If the filename is not given,
it is assumed to be the same as for the previous directive.)  This is not
typically used by users, but may be used by preprocessors so that
diagnostic messages refer to the original file.


@c -- We can probably lose this given the brevity of the section
@c  @node Summary ,  , Syntactic elements, Parser
@c  @section Summary of language

@node Function and Variable Index, Concept Index, Parser, Top
@unnumbered Function and Variable Index

@printindex vr

@node Concept Index, References, Function and Variable Index, Top
@unnumbered Concept Index

@printindex cp

@node References,  , Concept Index, Top
@appendix References

Richard A.@: Becker, John M.@: Chambers and Allan R.@: Wilks (1988),
@emph{The New S Language.} Chapman & Hall, New York.
This book is often called the ``@emph{Blue Book}''.

@bye

@c Local Variables: ***
@c mode: TeXinfo ***
@c End: ***
