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

Abby Spurdle @purd|e@@ @end|ng |rom gm@||@com
Thu Feb 25 07:35:49 CET 2021


I've completed the S4 example.
Thank you, Herve, for your assistance.

----begin code----
plotf <- function (f)
{   x <- seq (-1, 1,, 200)
    plot (x, f (x), type="l")
}

#s4-based function object, with slot
setClass ("Quad.S4", contains="function", slots = list (p="numeric") )
Quad.S4 <- function (p = c (0, 0, 1) )
{   f <- function (x)
    {   this <- sys.function ()
        p <- this using p
        p [1] + p [2] * x + p [3] * x^2
    }
    new ("Quad.S4", f, p=p)
}

f.s4 <- Quad.S4 ()
plotf (f.s4)
f.s4 using p


On Tue, Feb 23, 2021 at 11:23 AM Abby Spurdle (/əˈbi/)
<spurdle.a using gmail.com> wrote:
>
> Oh wow.
> Post of the year!
> Where's the like button?
>
> Note, I was able to rewrite it without the deprecated args.
> (Don't want one of those CRAN emails, in 12 months from now, saying
> please change XXXX).
>
> I'll have to come back to this later, to see if I can get the body of
> f() to access the slot
>
>
> On Mon, Feb 22, 2021 at 11:36 AM Hervé Pagès <hpages.on.github using gmail.com> wrote:
> >
> > 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 using name
> >    # [1] "square"
> >    f(11)
> >    # [1] 121
> >
> > Hope this helps,
> >
> > H.



More information about the R-help mailing list