Rev 25816 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
\name{initialize-methods}\docType{methods}\title{Methods to Initialize New Objects from a Class}\alias{initialize-methods}\alias{initialize,ANY-method}\alias{initialize,traceable-method}\alias{initialize,signature-method}\alias{initialize,environment-method}\description{The arguments to function \code{\link{new}} to create anobject from a particular class can be interpreted specially for thatclass, by the definition of a method for function \code{initialize}for the class. This documentation describes some existingmethods, and also outlines how to write new ones.}\section{Methods}{\describe{\item{.Object = "ANY"}{The default method for \code{initialize} takeseither named or unnamed arguments. Argument names must be thenames of slots in this class definition, and the correspondingarguments must be valid objects for the slot (that is, have thesame class as specified for the slot, or some superclass of thatclass). If the object comes from a superclass, it is not coercedstrictly, so normally it will retain its current class (specifically,\code{\link{as}(object, Class, strict = FALSE)}).Unnamed arguments must be objects of this class, of one of itssuperclasses, or one of its subclasses (from the class, from aclass this class extends, or from a class that extends thisclass). If the object is from a superclass, this normally definessome of the slots in the object. If the object is from asubclass, the new object is that argument, coerced to the currentclass.Unnamed arguments are processed first, in the order they appear.Then named arguments are processed. Therefore, explicit valuesfor slots always override any values inferred from superclass orsubclass arguments.}\item{.Object = "traceable"}{ Objects of a class that extends\code{traceable} are used to implement debug tracing (see\link{traceable-class} and \code{\link[base]{trace}}).The \code{initialize} method for these classes takes special arguments\code{def, tracer, exit, at, print}. The first of these is the objectto use as the original definition (e.g., a function). The otherscorrespond to the arguments to \code{\link[base]{trace}}.}\item{.Object = "environment"}{The \code{initialize} method forenvironments takes a named list of objects to be used toinitialize the environment. }\item{.Object = "signature"}{ This is a method for internal use only.}}}\section{Writing Initialization Methods}{Initialization methodsprovide a general mechanism corresponding to generator functions inother languages.The arguments to \code{\link{initialize}} are \code{.Object} and\dots. Nearly always, \code{initialize} is called from \code{new},not directly. The \code{.Object} argument is then theprototype object from the class.Two techniques are often appropriate for \code{initialize} methods:special argument names and \code{callNextMethod}.You may want argument names that are more natural to your users thanthe (default) slot names. These will be the formal arguments toyour method definition, in addition to \code{.Object} (always) and\dots (optionally). For example, the method for class\code{"traceable"} documented above would be created by a call to\code{\link{setMethod}} of the form:\code{setMethod("initialize", "traceable",}\cr\code{ function(.Object, def, tracer, exit, at, print) } \dots\cr\code{)}In this example, no other arguments are meaningful, and the resultingmethod will throw an error if other names are supplied.When your new class extends another class, you may want to call theinitialize method for this superclass (either a special method or thedefault). For example, suppose you want to define a method for yourclass, with special argument \code{x}, but you also want users to beable to set slots specifically. If you want \code{x} to override theslot information, the beginning of your method definition might looksomething like this:\code{function(.Object, x, ...) \{}\cr\code{ Object <- callNextMethod(.Object, ...) }\cr\code{ if(!missing(x)) \{ # do something with x }You could also choose to have the inherited method override, by firstinterpreting \code{x}, and then calling the next method.}\keyword{methods}\keyword{programming}