title: `as.matrix` and `as.data.frame` S3 methods vs. S4 methods
body: <p>I noticed that defining <code>as.matrix</code> or <code>as.data.frame</code> as S3 methods for an S4 class
  makes e.g. <code>lm (formula, objS4)</code> and <code>prcomp (object)</code> work out of the box. This doesn't work if they are defined as S4 methods.</p>
  
  <p>Why does it matter whether the methods are defined as S3 or S4 method?</p>
  
  <p>Example for <code>as.data.frame</code>:</p>
  
  <pre><code>setClass ("exampleclass", representation (x = "data.frame"))
  object &lt;- new ("exampleclass", x = iris)
  
  setMethod ("as.data.frame", signature="exampleclass", definition= function (x, ...) x@x )
  ## [1] "as.data.frame"
  
  as.data.frame (object)
  ## Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
  ## 1            5.1         3.5          1.4         0.2     setosa
  ## 2            4.9         3.0          1.4         0.2     setosa
  ## 3            4.7         3.2          1.3         0.2     setosa
  ## ...snip...
  
  lm (Petal.Length ~ Petal.Width, object)
  ## error in as.data.frame.default(data) : 
  ##   cannot coerce class 'structure("exampleclass", package = ".GlobalEnv")' into a data.frame
  
  as.data.frame.exampleclass &lt;- function (x, ...) x@x
  
  lm (Petal.Length ~ Petal.Width, object)
  ## Call:
  ##   lm(formula = Petal.Length ~ Petal.Width, data = object)
  ## 
  ## Coefficients:
  ##   (Intercept)  Petal.Width  
  ## 1.084        2.230  
  </code></pre>
  
  <p>As the situation may be a bit complicated with <code>lm</code> where the coercion will only occur when the formula is evaluated in an environment constructed from the data, here is a more simple case whith the same behaviour:</p>
  
  <pre><code>setMethod ("as.matrix", signature="exampleclass", definition= function (x, ...) as.matrix (x@x[, 1:4]) )
  prcomp (object)
  ## error in as.vector(data) : 
  ##   No method to coerce this S4 class into a vector
  as.matrix.exampleclass &lt;- function (x, ...) as.matrix (x@x [, 1:4])
  prcomp (object)
  ##   Standard deviations:
  ##     [1] 2.0562689 0.4926162 0.2796596 0.1543862
  ##   
  ## Rotation:
  ##   PC1         PC2         PC3        PC4
  ## Sepal.Length  0.36138659 -0.65658877  0.58202985  0.3154872
  ## Sepal.Width  -0.08452251 -0.73016143 -0.59791083 -0.3197231
  ## Petal.Length  0.85667061  0.17337266 -0.07623608 -0.4798390
  ## Petal.Width   0.35828920  0.07548102 -0.54583143  0.7536574
  </code></pre>
  
  <p>Here, <code>stats:::prcomp.default</code> is called, which starts with a plain <code>x &lt;- as.matrix (x)</code>. This fails with the above S4 definition, but works with the S3 definition.</p>