  This paper reviews some programming techniques in R that have proved useful,
particularly for substantial projects. These include several versions of
object-oriented programming, used in a large number of R packages. The review
tries to clarify the origins and ideas behind the various versions, each of
which is valuable in the appropriate context. R has also been strongly
influenced by the ideas of functional programming and, in particular, by the
desire to combine functional with object oriented programming. To clarify how
this particular mix of ideas has turned out in the current R language and
supporting software, the paper will first review the basic ideas behind
object-oriented and functional programming, and then examine the evolution of R
with these ideas providing context. Functional programming supports
well-defined, defensible software giving reproducible results. Object-oriented
programming is the mechanism par excellence for managing complexity while
keeping things simple for the user. The two paradigms have been valuable in
supporting major software for fitting models to data and numerous other
statistical applications. The paradigms have been adopted, and adapted,
distinctively in R. Functional programming motivates much of R but R does not
enforce the paradigm. Object-oriented programming from a functional perspective
differs from that used in non-functional languages, a distinction that needs to
be emphasized to avoid confusion. R initially replicated the S language from
Bell Labs, which in turn was strongly influenced by earlier program libraries.
At each stage, new ideas have been added, but the previous software continues
to show its influence in the design as well. Outlining the evolution will
further clarify why we currently have this somewhat unusual combination of
ideas.
