[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 22:10:06 CEST 2022
Thanks.
I think I prefer Ivan's solution too.
>
> 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.
Thought about naming the function something like that. On the other
hand, a lot of base R functions follow the following pattern in a
similar case
foo <- levels(x)
levels(x) <- ...
(There is also a `schema<-` method). Other examples of this are 'attr',
'class', 'length', 'dim', and 'names'. So for getters and setters the
pattern seems to be to not use get and set. I like this feature of R, so
would like to stick with it.
Best,
Jan
>
> 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