Skip to content
Back to formatted view

Raw Message

Message-ID: <64133a55-2ba0-448c-1770-02fdce65b797@dds.nl>
Date: 2022-08-08T13:10:37Z
From: Jan van der Laan
Subject: [R-pkg-devel] Using function with same name as argument as default argument

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