From murdoch@dunc@n @end|ng |rom gm@||@com  Tue Feb  6 22:20:33 2024
From: murdoch@dunc@n @end|ng |rom gm@||@com (Duncan Murdoch)
Date: Tue, 6 Feb 2024 16:20:33 -0500
Subject: [Rd] NOTE: multiple local function definitions for ?fun? with
 different formal arguments
In-Reply-To: <15c10f0d-2c05-4b84-a3f0-0c02fdbb15e2@gmail.com>
References: <5jst8ric3j9fg55fkwuhhlyk.1707061436584@email.android.com>
 <CA+jjkEbwGe-W-gSfds1=4Vzrf=LOitwiE=4Vx0+NCj4t2t09JA@mail.gmail.com>
 <lo01v1qa61gmseab9ma660ts.1707061568394@email.android.com>
 <5cb29a06-5b73-4fe4-b8dc-7aa9db6a2cff@gmail.com>
 <15c10f0d-2c05-4b84-a3f0-0c02fdbb15e2@gmail.com>
Message-ID: <6be852da-f101-4e0f-85f9-23679583f64a@gmail.com>

On 06/02/2024 2:17 p.m., Herv? Pag?s wrote:
> Thanks. Workarounds are interesting but... what's the point of the NOTE 
> in the first place?

Creating a function that can't be called could be an error.  Presumably 
you are careful and never try to call it with the wrong signature, but 
the check code isn't smart enough to follow every code path, so it gives 
the note to warn you that you might have something wrong.

You still have the same issue with my workaround, but the check code 
isn't smart enough to notice that.

Duncan Murdoch

> 
> H.
> 
> On 2/4/24 09:07, Duncan Murdoch wrote:
>> On 04/02/2024 10:55 a.m., Izmirlian, Grant (NIH/NCI) [E] via R-devel 
>> wrote:
>>> Well you can see that yeast is exactly weekday you have.? The way out 
>>> is to just not name the result
>>
>> I think something happened to your explanation...
>>
>>>
>>> toto <- function(mode)
>>> {
>>> ???? ifelse(mode == 1,
>>> ???????? function(a,b) a*b,
>>> ???????? function(u, v, w) (u + v) / w)
>>> }
>>
>> It's a bad idea to use ifelse() when you really want if() ... else ... 
>> . ?In this case it works, but it doesn't always.? So the workaround 
>> should be
>>
>>
>> toto <- function(mode)
>> {
>> ??? if(mode == 1)
>> ??????? function(a,b) a*b
>> ??? else
>> ??????? function(u, v, w) (u + v) / w
>> }
>>
>>
>>>
>>>
>>> ________________________________
>>> From: Grant Izmirlian <izmirlidroid at gmail.com>
>>> Date: Sun, Feb 4, 2024, 10:44 AM
>>> To: "Izmirlian, Grant (NIH/NCI) [E]" <izmirlig at mail.nih.gov>
>>> Subject: Fwd: [EXTERNAL] R-devel Digest, Vol 252, Issue 2
>>>
>>> Hi,
>>>
>>> I just ran into this 'R CMD check' NOTE for the first time:
>>>
>>> * checking R code for possible problems ... NOTE
>>> toto: multiple local function definitions for ?fun? with different
>>> ?? formal arguments
>>>
>>> The "offending" code is something like this (simplified from the real 
>>> code):
>>>
>>> toto <- function(mode)
>>> {
>>> ???? if (mode == 1)
>>> ???????? fun <- function(a, b) a*b
>>> ???? else
>>> ???????? fun <- function(u, v, w) (u + v) / w
>>> ???? fun
>>> }
>>>
>>> Is that NOTE really intended? Hard to see why this code would be
>>> considered "wrong".
>>>
>>> I know it's just a NOTE but still...
>>
>> I agree it's a false positive, but the issue is that you have a 
>> function object in your function which can't be called 
>> unconditionally.? The workaround doesn't create such an object.
>>
>> Recognizing that your function never tries to call fun requires global 
>> inspection of toto(), and most of the checks are based on local 
>> inspection.
>>
>> Duncan Murdoch
>>
>> ______________________________________________
>> R-devel at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
> 
> -- 
> Herv? Pag?s
> 
> Bioconductor Core Team
> hpages.on.github at gmail.com
>



[Rd] NOTE: multiple local function definitions for ?fun? with different formal arguments
Duncan Murdoch