# [R] Is it Possible to Create S4 Function Objects?

Abby Spurdle (/əˈbi/) @purd|e@@ @end|ng |rom gm@||@com
Tue Feb 16 00:03:54 CET 2021

```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) )
{   #?
}

plotf (f.lex)
environment (f.lex)\$p

plotf (f.s3)
attr (f.s3, "p")

#plotf (f.s4)
#f.s4 using p

On Sat, Feb 13, 2021 at 10:53 AM Abby Spurdle (/əˈbi/)
<spurdle.a using 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 using 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 using 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.

```