From mtmorgan at fhcrc.org  Tue Jun 23 15:25:53 2009
From: mtmorgan at fhcrc.org (Martin Morgan)
Date: Tue, 23 Jun 2009 06:25:53 -0700
Subject: [Rd] Accessing an object from the function in its .Data slot?
In-Reply-To: <4A40BE59.7050804@stats.uwo.ca>
References: <116117690906230348m6aca035bo9ea96f7569ed86b7@mail.gmail.com>
	<4A40BE59.7050804@stats.uwo.ca>
Message-ID: <4A40D7E1.6050900@fhcrc.org>

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



[Rd] Accessing an object from the function in its .Data slot?
Martin Morgan