I am certainly not an expert in S4 and know enough to be dangerous.
That being said, I used setMethod() as Romain had done. I would defer to others
with greater experience as to the pros and cons, including the risk of
confusion, but here is one approach, extending the example in ?slot:
setClass("track", representation(x = "numeric", y = "numeric", z = "list"))
myTrack <- new("track", x = -4:4, y = exp(-4:4), z = list(A = 1:5, B = 7:12))
setMethod( "$", "track", function(x, name){
slot(x, "z")[[name]]
})
> myTrack
An object of class "track"
Slot "x":
[1] -4 -3 -2 -1 0 1 2 3 4
Slot "y":
[1] 0.01831564 0.04978707 0.13533528 0.36787944 1.00000000
[6] 2.71828183 7.38905610 20.08553692 54.59815003
Slot "z":
$A
[1] 1 2 3 4 5
$B
[1] 7 8 9 10 11 12
> mytr...@z
$A
[1] 1 2 3 4 5
$B
[1] 7 8 9 10 11 12
# Default
> mytr...@z$a
[1] 1 2 3 4 5
> mytr...@z$b
[1] 7 8 9 10 11 12
# Use the new '$' method
> myTrack$A
[1] 1 2 3 4 5
> myTrack$B
[1] 7 8 9 10 11 12
Not sure if that gets you something along the lines of what you wanted, but
perhaps it is helpful.
Marc
On Jul 9, 2010, at 8:10 AM, Renaud Gaujoux wrote:
> I do not want to access the slot itself but its content: a:toto would be
> a...@slot1[['toto']].
> The thing is that I would like to have two different methods: '$' (that I
> already have) and another one to define, ideally that behaves like '$'.
> So in brief:
> - a:toto would be for a...@slot1[['toto']]
> - a$tata would be for a...@slot2[['tata']]
>
> But apparently it might not be possible.
>
> --
> Renaud Gaujoux
> Computational Biology - University of Cape Town
> South Africa
>
>
> On 09/07/2010 14:58, Marc Schwartz wrote:
>> You were, in effect, trying to overload the ":" operator, which is of course
>> for defining sequences.
>>
>> If you are using S4 methods, what is wrong with using the default "@" as the
>> extraction syntax (eg. a...@name) to get at slots?
>>
>> See ?"@" and ?slot
>>
>> HTH,
>>
>> Marc Schwartz
>>
>> On Jul 9, 2010, at 7:49 AM, Renaud Gaujoux wrote:
>>
>>
>>> Alright.
>>> Maybe the symbol I chose was not appropriate. I tried ':' to be able to do
>>> 'a:name' with 'a' a S4 object.
>>> I get the following error:
>>> Error in genericForPrimitive(f) :
>>> methods may not be defined for primitive function ":" in this version of R
>>>
>>> Does there exist any symbol that would be suitable for the job?
>>> Thanks
>>>
>>> --
>>> Renaud Gaujoux
>>> Computational Biology - University of Cape Town
>>> South Africa
>>>
>>>
>>> On 09/07/2010 14:29, Duncan Murdoch wrote:
>>>
>>>> On 09/07/2010 8:18 AM, Renaud Gaujoux wrote:
>>>>
>>>>> Hi,
>>>>>
>>>>> is there a way to define a method say '$$' that would behave like '$' and
>>>>> allow calls like 'a$$name'?
>>>>>
>>>> No, the parser handles a fixed syntax, and that expression is not legal.
>>>> You could do it with
>>>>
>>>> a %$$% name
>>>>
>>>> using the infix operator syntax. (I think the description in the R
>>>> Language Definition suggests this is not legal, since $$ is not a valid
>>>> name, but it does currently work and that's unlikely to change.)
>>>>
>>>> Duncan Murdoch
>>>>
>>
______________________________________________
[email protected] mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel