new                 package:methods                 R Documentation

_G_e_n_e_r_a_t_e _a_n _O_b_j_e_c_t _f_r_o_m _a _C_l_a_s_s

_D_e_s_c_r_i_p_t_i_o_n:

     Given the the name or the definition of a class, plus optionally
     data to be included in the object, 'new' returns an object from
     that class.

_U_s_a_g_e:

     new(Class, ...)

     initialize(.Object, ...)

_A_r_g_u_m_e_n_t_s:

   Class: Either the name of a class (the usual case) or the object
          describing the class (e.g., the value returned by
          'getClass').

     ...: Data to include in the new object.  Named arguments
          correspond to slots in the class definition. Unnamed
          arguments must be objects from classes that this class
          extends.

 .Object: An object:  see the Details section.

_D_e_t_a_i_l_s:

     The function 'new' begins by copying the prototype object from the
     class definition.  Then information is inserted according to the
     '...' arguments, if any.

     The interpretation of the '...' arguments can be specialized to
     particular classes, if an appropriate method has been defined for
     the generic function '"initialize"'.  The 'new' function calls
     'initialize' with the object generated from the prototype as the
     '.Object' argument to 'initialize'.

     By default, unnamed arguments in the '...' are interpreted as
     objects from a superclass, and named arguments are interpreted as
     objects to be assigned into the correspondingly named slots. 
     Thus, explicit slots override inherited information for the same
     slot, regardless of the order in which the arguments appear.

     The 'initialize' methods do not have to have '...' as their second
     argument (see the examples), and generally it is better design
     _not_ to have '...' as a formal argument, if only a fixed set of
     arguments make sense.

     For examples of 'initialize' methods, see 'initialize-methods' for
     existing methods for classes '"traceable"' and '"environment"',
     among others.

     Note that the basic vector classes, '"numeric"', etc. are
     implicitly defined, so one can use 'new' for these classes.

_R_e_f_e_r_e_n_c_e_s:

     The web page <URL: http://www.omegahat.org/RSMethods/index.html>
     is the primary documentation.

     The functions in this package emulate the facility for classes and
     methods described in _Programming with Data_ (John M. Chambers,
     Springer, 1998).  See this book for further details and examples.

_S_e_e _A_l_s_o:

     Classes

_E_x_a_m_p_l_e_s:

     ## using the definition of class "track" from Classes



     ## a new object with two slots specified
     t1 <- new("track", x = seq(along=ydata), y = ydata)

     # a new object including an object from a superclass, plus a slot
     t2 <- new("trackCurve", t1, smooth = ysmooth)

     ### define a method for initialize, to ensure that new objects have
     ### equal-length x and y slots.

     setMethod("initialize",
               "track",
               function(.Object, x = numeric(0), y = numeric(0)) {
                 if(nargs() > 1) {
                   if(length(x) != length(y))
                     stop("specified x and y of different lengths")
                   .Object@x <- x
                   .Object@y <- y
                 }
                 .Object
               })

     ### the next example will cause an error (x will be numeric(0)),
     ### because we didn't build in defaults for x,
     ### although we could with a more elaborate method for initialize

     try(new("track", y = sort(rnorm(10))))

     ## a better way to implement the previous initialize method.
     ## Why?  By using callNextMethod to call the default initialize method
     ## we don't inhibit classes that extend "track" from using the general
     ## form of the new() function.  In the previous version, they could only
     ## use x and y as arguments to new, unless they wrote their own
     ## intialize method.

     setMethod("initialize", "track", function(.Object, ...) {
         .Object <- callNextMethod()
         if(length(.Object@x) != length(.Object@y))
          stop("specified x and y of different lengths")
         .Object
       })

