Abby Spurdle (/əˈbi/)
2021-Feb-12 21:53 UTC
[R] Is it Possible to Create S4 Function Objects?
Dear All, I was wondering if it's possible to create S4 function objects? (Or S4 closures, if you prefer). i.e. An R object, that is both an S4 object, and a function. This would allow one to write:> f <- constructor4.functionobj () > f () > f at slot.of.fI've searched for this, but I can't find any examples. If it's possible, then that leads to the question of if/how the body of f() could directly access the value of the slot?> f <- function () > this at slot.of.fI should note that the more common approach of storing values in a function's environment, doesn't work well for top-level objects. This approach is dependent on immutability of the function's data, and I'm reluctant to create such constraints.
Abby Spurdle (/əˈbi/)
2021-Feb-15 23:03 UTC
[R] Is it Possible to Create S4 Function Objects?
It appears that my previous post may lack clarity. So, I've created three examples of mathematical function objects. (One) using a standard closure with lexical scoping, (two) using S3 with an attribute and (three) using S4 with a slot. Each example constructs the function object via a constructor (of some form), plots it, then prints the attribute/etc. However, the third example with S4 is incomplete. Any suggestions welcome. ----begin code---- plotf <- function (f) { x <- seq (-1, 1,, 200) plot (x, f (x), type="l") } #standard closure, with lexical scoping quad.lex <- function (p = c (0, 0, 1) ) { function (x) p [1] + p [2] * x + p [3] * x^2 } #s3-based function object, with attribute quad.s3 <- function (p = c (0, 0, 1) ) { f <- function (x) { this <- sys.function () p <- attr (this, "p") p [1] + p [2] * x + p [3] * x^2 } attr (f, "p") <- p f } #s4-based function object, with slot setClass ("Quad.S4", slots = list (p="numeric") ) Quad.S4 <- function (p = c (0, 0, 1) ) { #? } f.lex <- quad.lex () plotf (f.lex) environment (f.lex)$p f.s3 <- quad.s3 () plotf (f.s3) attr (f.s3, "p") f.s4 <- Quad.S4 () #plotf (f.s4) #f.s4 at p On Sat, Feb 13, 2021 at 10:53 AM Abby Spurdle (/??bi/) <spurdle.a at gmail.com> wrote:> > Dear All, > > I was wondering if it's possible to create S4 function objects? > (Or S4 closures, if you prefer). > > i.e. > An R object, that is both an S4 object, and a function. > > This would allow one to write: > > > f <- constructor4.functionobj () > > f () > > f at slot.of.f > > I've searched for this, but I can't find any examples. > > If it's possible, then that leads to the question of if/how the body > of f() could directly access the value of the slot? > > > f <- function () > > this at slot.of.f > > I should note that the more common approach of storing values in a > function's environment, doesn't work well for top-level objects. > This approach is dependent on immutability of the function's data, and > I'm reluctant to create such constraints.
Hi Abby, Something along the line of: setClass("S4Function", contains="function", representation(name="character", more_stuff="ANY") ) seems to do what you want: f <- new("S4Function", function(a) a^2, name="square") # 'f' is both an S4 object and a function: is.object(f) # [1] TRUE is.function(f) # [1] TRUE f at name # [1] "square" f(11) # [1] 121 Hope this helps, H. On 2/12/21 1:53 PM, Abby Spurdle (/??bi/) wrote:> Dear All, > > I was wondering if it's possible to create S4 function objects? > (Or S4 closures, if you prefer). > > i.e. > An R object, that is both an S4 object, and a function. > > This would allow one to write: > >> f <- constructor4.functionobj () >> f () >> f at slot.of.f > > I've searched for this, but I can't find any examples. > > If it's possible, then that leads to the question of if/how the body > of f() could directly access the value of the slot? > >> f <- function () >> this at slot.of.f > > I should note that the more common approach of storing values in a > function's environment, doesn't work well for top-level objects. > This approach is dependent on immutability of the function's data, and > I'm reluctant to create such constraints. > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >-- Herv? Pag?s Bioconductor Core Team hpages.on.github at gmail.com