Martin Kober
2009-Jun-23 10:48 UTC
[Rd] Accessing an object from the function in its .Data slot?
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? 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
Duncan Murdoch
2009-Jun-23 11:36 UTC
[Rd] Accessing an object from the function in its .Data slot?
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. 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 >