% File src/library/base/man/zMethods.Rd
% Part of the R package, https://www.R-project.org
% Copyright 1995-2015 R Core Team
% Distributed under GPL 2 or later

\name{InternalMethods}
\alias{InternalMethods}
\alias{InternalGenerics}
\alias{internal generic}
\alias{.S3PrimitiveGenerics}
\title{Internal Generic Functions}
\description{
  Many \R-internal functions are \emph{generic} and allow
  methods to be written for.
}

  % -------------------- grep -nw DispatchOrEval src/*/*[ch]
  %                         --------------
\details{
  The following primitive and internal functions are \emph{generic},
  i.e., you can write \code{\link{methods}} for them:

  \code{\link{[}},%            % do_subset()         [subset.c]
  \code{\link{[[}},%           % do_subset2()        [subset.c]
  \code{\link{$}},
  \code{\link{[<-}},
  \code{\link{[[<-}},
  \code{\link{$<-}},

  \code{\link{length}},%      % do_length()          [array.c]
  \code{\link{length<-}},%    % do_lengthgets()      [builtin.c]
  \code{\link{dimnames}},%    % do_dimnames()        [attrib.c]
  \code{\link{dimnames<-}},%  % do_dimnamesgets()    [attrib.c]
  \code{\link{dim}},%         % do_dim()             [attrib.c]
  \code{\link{dim<-}},%       % do_dimgets()         [attrib.c]
  \code{\link{names}},%       % do_names()           [attrib.c]
  \code{\link{names<-}},%     % do_namesgets()       [attrib.c]
  \code{\link{levels<-}},%    % do_levelsgets()      [attrib.c]

  \code{\link{c}},%           % do_c()               [bind.c]
  \code{\link{unlist}},%      % do_unlist()          [bind.c]
  \code{\link{cbind}},%       not via DispatchOrEval [bind.c]
  \code{\link{rbind}},

  \code{\link{as.character}},
  \code{\link{as.complex}},
  \code{\link{as.double}},
  \code{\link{as.integer}},
  \code{\link{as.logical}},
  \code{\link{as.raw}},
  \code{\link{as.vector}},%   % do_asvector()        [coerce.c]
  \code{\link{is.array}},
  \code{\link{is.matrix}},
  \code{\link{is.na}},%       % do_isna()            [coerce.c]
  \code{\link{is.nan}},%      % do_isnan()           [coerce.c]
  \code{\link{is.numeric}},
  \code{\link{rep}},%                                [seq.c]
  \code{\link{seq.int}}
  (which dispatches methods for \code{"seq"})%       [seq.c]
  and \code{\link{xtfrm}}%                           [sort.c]

  In addition, \code{is.name} is a synonym for \code{\link{is.symbol}} and
  dispatches methods for the latter.  Similarly, \code{\link{as.numeric}}
  is a synonym for \code{as.double} and dispatches methods for the
  latter, i.e., S3 methods are for \code{as.double}, whereas S4 methods
  are to be written for \code{as.numeric}.

  Note that all of the \link{group generic} functions are also
  internal/primitive and allow methods to be written for them.

  \code{.S3PrimitiveGenerics} is a character vector listing the
  primitives which are internal generic and not \link{group generic}.
  Currently \code{\link{as.vector}}, \code{\link{cbind}},
  \code{\link{rbind}} and \code{\link{unlist}} are the internal
  non-primitive functions which are internally generic.

  For efficiency, internal dispatch only occurs on \emph{objects}, that
  is those for which \code{\link{is.object}} returns true.
}
\seealso{
  \code{\link{methods}} for the methods which are available.
}
\keyword{methods}
