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

Jan van der Laan rhe|p @end|ng |rom eoo@@dd@@n|
Mon Aug 8 16:23:35 CEST 2022


Hi Andrew and Ivan,

Thanks for the suggestion. Both are good suggestions; better than what I 
have.


Andrews solution:

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

Ivans:

 > function(x, schema = mypackagename::schema(x))

Both would work in this case. Ivans is a bit cleaner/simpler; Andrews 
appears simpler from a user perspective. Not sure yet which one I will 
use; I am currently leaning towards Ivans solution.

Thanks!
Jan





On 08-08-2022 15:42, Andrew Simmons wrote:
> 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 
> <mailto: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 <mailto:R-package-devel using r-project.org>
>     mailing list
>     https://stat.ethz.ch/mailman/listinfo/r-package-devel
>     <https://stat.ethz.ch/mailman/listinfo/r-package-devel>
>



More information about the R-package-devel mailing list