[R-pkg-devel] Using function with same name as argument as default argument
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 at 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 at r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-package-devel