[R-pkg-devel] Using function with same name as argument as default argument

Andrew Simmons @kw@|mmo @end|ng |rom gm@||@com
Mon Aug 8 15:42:32 CEST 2022


Hello,


This isn't something that can be fixed in the parser. If an argument isn't
provided, its default value is evaluated inside the function, so it gives
you a loop where schema = schema(x), but then what's schema, it's
schema(x), thus the recursion error. you could do something like this:

foo <- function (x, schema = schema(x))
{
    if (missing(schema)) {
        rm(schema)
        schema <- schema(x)
    }
}

which, while kinda gross looking, means that schema = schema(x) can be
evaluated without causing a recursion error.

On Mon, Aug 8, 2022, 09:11 Jan van der Laan <rhelp using eoos.dds.nl> wrote:

> Not sure if this belongs on r-help or r-package-devel; decided for the
> latter as the question is mainly relevant when writing code to be used
> by others.
>
> The issue I run into is that I want to write a function similar to:
>
>
> foo <- function(x, schema = schema(x)) {
>    if (is.null(schema)) stop("schema missing")
>    # ...
> }
>
> with 'schema()' something like (strongly simplified):
>
> schema <- function(x) attr(x, "schema")
>
>
> However using both the argument schema and calling the schema() function
> in one of the default arguments is not allowed ans results in the
> following somewhat cryptic error message:
>
> Error in foo(1:3) :
>    promise already under evaluation: recursive default argument
> reference or earlier problems?
>
> I am looking for a clean solution to this. I can rename the argument or
> function, but calling it something other than schema feels impractical
> as both refer to the same thing (the schema of x). The best solution I
> have come up with until now is to define a second function to be used in
> default function arguments:
>
> schema_ <- schema
>
> foo <- function(x, schema = schema_(x)) {
>    if (is.null(schema)) stop("schema missing")
>    # ...
> }
>
> I guess another solution would be:
>
> foo <- function(x, schema) {
>    if (missing(schema)) schema <- schema(x)
> }
>
> But then it is not clear for the user from the interface that the
> 'schema' argument can be omitted.
>
> I am hoping some of you have other suggestions.
>
> And, is this something that could be 'fixed' in the R-parser?
>
>
> Thanks,
> Jan
>
> ______________________________________________
> R-package-devel using r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-package-devel
>

	[[alternative HTML version deleted]]



More information about the R-package-devel mailing list