title: Is it bad practice to access S4 objects slots directly using @?
body: <p>This one is almost a philosophical question: is it bad to access and/or set slots of S4 objects directly using <code>@</code>?</p>
  
  <p>I have always been told it was bad practice, and that users should use "accessor" S4 methods, and that developers should provide their users with these. But I'd like to know if anybody knows the real deal behind this?</p>
  
  <p>Here's an example using the <code>sp</code> package (but could be generalised for any S4 class):</p>
  
  <pre><code>&gt; library(sp)
  &gt; foo &lt;- data.frame(x = runif(5), y = runif(5), bar = runif(5))
  &gt; coordinates(foo) &lt;- ~x+y
  &gt; class(foo)
  [1] "SpatialPointsDataFrame"
  attr(,"package")
  [1] "sp"
  
  &gt; str(foo)
  Formal class 'SpatialPointsDataFrame' [package "sp"] with 5 slots
    ..@ data       :'data.frame': 5 obs. of  1 variable:
    .. ..$ bar: num [1:5] 0.621 0.273 0.446 0.174 0.278
    ..@ coords.nrs : int [1:2] 1 2
    ..@ coords     : num [1:5, 1:2] 0.885 0.763 0.591 0.709 0.925 ...
    .. ..- attr(*, "dimnames")=List of 2
    .. .. ..$ : NULL
    .. .. ..$ : chr [1:2] "x" "y"
    ..@ bbox       : num [1:2, 1:2] 0.591 0.155 0.925 0.803
    .. ..- attr(*, "dimnames")=List of 2
    .. .. ..$ : chr [1:2] "x" "y"
    .. .. ..$ : chr [1:2] "min" "max"
    ..@ proj4string:Formal class 'CRS' [package "sp"] with 1 slots
    .. .. ..@ projargs: chr NA
  
  &gt; foo@data
          bar
  1 0.6213783
  2 0.2725903
  3 0.4458229
  4 0.1743419
  5 0.2779656
  &gt; foo@data &lt;- data.frame(bar = letters[1:5], baz = runif(5))
  &gt; foo@data
    bar        baz
  1   a 0.22877446
  2   b 0.93206667
  3   c 0.28169866
  4   d 0.08616213
  5   e 0.36713750
  </code></pre>