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

Duncan Murdoch murdoch@dunc@n @end|ng |rom gm@||@com
Mon Aug 8 18:14:23 CEST 2022


I kind of prefer Ivan's solution.  A variation on Andrew's that doesn't 
require you to code the default in two places is:

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

You could also change the name of the argument and let users rely on 
partial argument matching:


foo <- function(x, schema. = schema(x)) {
    schema <- schema.   # if you don't want to type the dot again
    if (is.null(schema)) stop("schema missing")
    # ...
}

This allows users to say foo(x, schema = myschema(x)) .

However, I'd say it's not a great design.  Probably changing your 
function name to `getSchema` would be the best overall solution:


foo <- function(x, schema = getSchema(x)) {
    if (is.null(schema)) stop("schema missing")
    # ...
}

Functions do actions, so their names should be verb-like.

Duncan Murdoch

On 08/08/2022 10:23 a.m., Jan van der Laan wrote:
> 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>
>>
> 
> ______________________________________________
> R-package-devel using r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-package-devel



More information about the R-package-devel mailing list