[Rd] Accessing an object from the function in its .Data slot?
Martin Morgan
mtmorgan at fhcrc.org
Tue Jun 23 15:25:53 CEST 2009
Duncan Murdoch wrote:
> Martin Kober wrote:
>> I have an S4 object extending "function". Is it there a good way to
>> access the object (resp. its slots) from within the function in .Data?
>>
>
> I don't think so. That's not really the way the S4 object system is
> designed to work. If a function needs access to an object, the object
> should be one of the args to the function, or defined in its
> environment. Where the function happens to be stored is irrelevant.
One variant uses R's lexical scope to maintain state independent of the
S4 object per se, e.g.,
setClass("NthPower",
representation=representation("function"))
setMethod(initialize, "NthPower", function(.Object, ..., n) {
callNextMethod(.Object, .Data=function(x) {
x^n
}, ...)
})
and then
> twoth <- new("NthPower", n=2)
> tenth <- new("NthPower", n=10)
> twoth(2)
[1] 4
> tenth(2)
[1] 1024
Martin
> Duncan Murdoch
>> If I'm reading help files correctly, it is not possible to overload
>> '(' (which would be the most elegant solution, I suppose). I can
>> enclose the slotted data in the function when it is created, but that
>> obviously doesn't work when that data changes later on (also it
>> duplicates the data).
>>
>> I tried to use the call stack, and this does seem to work:
>>
>>
>>> setClass("abcd", representation(.Data="function", x="character"))
>>> a = new("abcd",
>>> .Data=function() str( get( as.character( sys.call()[[1]] ),
>>> pos=parent.frame() ) ),
>>> x="testtxt")
>>> a()
>>>
>> Formal class 'abcd' [package ".GlobalEnv"] with 2 slots
>> ..@ .Data:function (x)
>> ..@ x : chr "testtxt"
>>
>> That is obviously a not-so-elegant hack, and I'm not sure it works
>> under all circumstances as I'm not an expert on R's call system.
>>
>> Is there any better way to achieve this?
>>
>> Thanks in advance
>> Martin
>>
>> ______________________________________________
>> R-devel at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
More information about the R-devel
mailing list