From ripley at stats.ox.ac.uk  Thu May 11 21:53:37 2006
From: ripley at stats.ox.ac.uk (Prof Brian Ripley)
Date: Thu, 11 May 2006 20:53:37 +0100 (BST)
Subject: [Rd] @ accesses attributes, not just formal slots ?
In-Reply-To: <C413B816-C6F7-498E-9145-7BB66AF5E921@mac.com>
References: <C413B816-C6F7-498E-9145-7BB66AF5E921@mac.com>
Message-ID: <Pine.LNX.4.64.0605112046260.6541@gannet.stats.ox.ac.uk>

On Thu, 11 May 2006, Parlamis Franklin wrote:

> Using the '@' operator, I am able to extract a 'names' attribute
> assigned to a formal object.
> However, I can not use the replacement form ('@<-') to assign that
> attribute.
>
> > setClass("foo", representation("numeric"))
> [1] "foo"
> > (new("foo", 1:4)->a)
> An object of class ?foo?
> [1] 1 2 3 4
> > names(a) <- LETTERS[1:4]
> > a at names
> [1] "A" "B" "C" "D"
> > a at names <- LETTERS[5:8]
> Error in checkSlotAssignment(object, name, value) :
> 	"names" is not a slot in class "foo"
>
> I don't know that this asymmetry will ever cause a problem, but I
> just wanted to note it because it appears from the help pages
> 'slot {methods}'  and 'slotOp {base}' that the '@' operator is only
> intended to provide access to defined slots.

Yes, it is intended so.  It is a side effect of the current implementation 
that @ will also access attributes, but that may change.  Note that the
help page for @ says

      These operators support the formal classes of package 'methods'.
      See 'slot' for further details. Currently there is no checking
      that the object is an instance of a class.

so this should not come as a surprise to you.

-- 
Brian D. Ripley,                  ripley at stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595



[Rd] @ accesses attributes, not just formal slots ?
Prof Brian Ripley