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@r-project.org mailing list >> https://stat.ethz.ch/mailman/listinfo/r-devel >> > > ______________________________________________ > R-devel@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel