[R] using setMethod or setGeneric to change S4 accessor symbol from @ to $

Martin Morgan mtmorgan at fhcrc.org
Mon Feb 8 22:54:02 CET 2010


On 02/08/2010 01:22 PM, Markus Weisner wrote:
> Worked like a charm!!  Thank you so much.  I just plugged the following into
> my code ...
> 
> setMethod("$", "CADresponses", function(x, name) slot(x, name))
> 
> ... and it worked perfect.  If you don't mind, I have a quick follow up
> question, using your example
> 
> setClass("A", representation(a="numeric", b="numeric"))
> setMethod("$", "A", function(x, name) slot(x, name))
> data = new("A", a=1:10, b=1:10)
> data$a[5] #now works thanks to your code
> data$a[5] <- 200 #assignments do not work -- any ideas?

same idea, but for "$<-"

> setClass("A", representation(a="numeric"))
[1] "A"
> getGeneric("$<-")
standardGeneric for "$<-" defined from package "base"

function (x, name, value)
standardGeneric("$<-", .Primitive("$<-"))
<environment: 0x14c33a8>
Methods may be defined for arguments: x, value
Use  showMethods("$<-")  for currently available ones.
> setReplaceMethod("$", "A", function(x, name, value) {
+     slot(x, name) <- value
+     x
+ })
[1] "$<-"
> a <- new("A", a=1:10)
> a$a <- 10:1
> a
An object of class "A"
Slot "a":
 [1] 10  9  8  7  6  5  4  3  2  1

> data[5,c("a")] = 200 #would also like this to work -- any ideas?
> 
> Do you have any suggestions for getting assignments and brackets to work as
> they would for data frames?  Thanks so much for your help.

same approach, but using getGeneric("[") and getGeneric("[<-") to guide you.

Martin

> Best,
> Markus
> 
> 
> 
> On Mon, Feb 8, 2010 at 2:44 PM, Martin Morgan <mtmorgan at fhcrc.org> wrote:
> 
>> On 02/07/2010 08:31 PM, Markus Weisner wrote:
>>> I created some S4 objects that are essentially data frame objects.  The
>> S4
>>> object definitions were necessary to verify data integrity and force a
>>> standardized data format.  I am, however, finding myself redefining all
>> the
>>> typical generic functions so that I can still manipulate my S4 objects as
>> if
>>> they were data frames ... I have used setMethod to set methods for
>> "subset",
>>> "head", and "tail".  I would like to use setMethod or setGeneric to
>> enable
>>> me to use object$slotname to access object at slotname for my S4 objects.
>>  Any
>>> advice is appreciated.  Thanks.
>>
>> Hi Markus --
>>
>>> setClass("A", representation(a="numeric"))
>> [1] "A"
>>> new("A")$a
>> Error in new("A")$a : $ operator not defined for this S4 class
>>> getGeneric("$")
>> standardGeneric for "$" defined from package "base"
>>
>> function (x, name)
>> standardGeneric("$", .Primitive("$"))
>> <environment: 0xa62028>
>> Methods may be defined for arguments: x
>> Use  showMethods("$")  for currently available ones.
>>> setMethod("$", "A", function(x, name) slot(x, name))
>> [1] "$"
>>> new("A", a=1:10)$a
>>  [1]  1  2  3  4  5  6  7  8  9 10
>>> new("A", a=1:10)$b
>> Error in slot(x, name) : no slot of name "b" for this object of class "A"
>>
>> does that help?
>>
>> Martin
>>
>>> --Markus
>>>
>>>       [[alternative HTML version deleted]]
>>>
>>> ______________________________________________
>>> R-help at r-project.org mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-help
>>> PLEASE do read the posting guide
>> http://www.R-project.org/posting-guide.html
>>> and provide commented, minimal, self-contained, reproducible code.
>>
>>
>> --
>> Martin Morgan
>> Computational Biology / Fred Hutchinson Cancer Research Center
>> 1100 Fairview Ave. N.
>> PO Box 19024 Seattle, WA 98109
>>
>> Location: Arnold Building M1 B861
>> Phone: (206) 667-2793
>>
> 


-- 
Martin Morgan
Computational Biology / Fred Hutchinson Cancer Research Center
1100 Fairview Ave. N.
PO Box 19024 Seattle, WA 98109

Location: Arnold Building M1 B861
Phone: (206) 667-2793



More information about the R-help mailing list