From @|ex @end|ng |rom bed@t@dr|ven@com  Tue Oct  1 10:38:32 2019
From: @|ex @end|ng |rom bed@t@dr|ven@com (Bertram, Alexander)
Date: Tue, 1 Oct 2019 10:38:32 +0200
Subject: [Rd] Is missingness always passed on?
In-Reply-To: <CAOdV3zCtz4_pOXF8J9smOCVDsd2YOvCBx_-qBr1MQBmUvx7sBQ@mail.gmail.com>
References: <1fc5777f-cc96-ceb7-f2e4-4475622ce77b-860@gmail.com>
 <CAOdV3zCtz4_pOXF8J9smOCVDsd2YOvCBx_-qBr1MQBmUvx7sBQ@mail.gmail.com>
Message-ID: <CAOdV3zCRNXGx4W7FLmA5QhWqR90Qkp0NH5qbAcK5jemsW_XQPA@mail.gmail.com>

The updated example was meant to read:

f1 <- function(x = NULL, y = NULL, z = NULL){
  if(missing(x))
    cat("f1: x is missing\n")
  if(missing(y))
    cat("f1: y is missing\n")
}

f2 <- function(x = NULL, y = NULL, z = NULL){
  if(missing(z))
    cat("f2: z is missing\n")
  f1(x, y)
}

f2()

Alex

On Tue, Oct 1, 2019 at 10:37 AM Bertram, Alexander <alex at bedatadriven.com>
wrote:

> There is "missing with default" and "missing without default".
>
> If an argument x is missing without a default, then missing(x) is true, if
> you pass x to another function, it will pass the value of the "missing
> argument". (which is different than simply being missing!)
>
> If an argument x is missing _with_a default, then missing(x) is still
> true, but if you pass x to another function, the default value is passed,
> not the missing argument symbol.
>
> If you add default arguments to your example, you'll see this effect:
>
> f1 <- function(x, y, z){
>    if(missing(x))
>      cat("f1: x is missing\n")
>    if(missing(y))
>      cat("f1: y is missing\n")
> }
>
> f2 <- function(x, y, z){
>    if(missing(z))
>      cat("f2: z is missing\n")
>    f1(x, y)
> }
>
> f2()
>
> prints
>
> f2: z is missing
>
> The intersection of default values, and the representation of missing
> without a default as a symbol yields some unexpected and complex behaviors.
> Here are a few more fun examples:
>
> https://github.com/bedatadriven/renjin/blob/master/tests/src/test/R/test.missing.R
>
> Best,
> Alex
>
>
>
> On Tue, Oct 1, 2019, 10:27 Duncan Murdoch <murdoch.duncan at gmail.com>
> wrote:
>
>>
>> There's a StackOverflow question
>> https://stackoverflow.com/q/22024082/2554330 that references this text
>> from ?missing:
>>
>> "Currently missing can only be used in the immediate body of the
>> function that defines the argument, not in the body of a nested function
>> or a local call. This may change in the future."
>>
>> Someone pointed out (in https://stackoverflow.com/a/58169498/2554330)
>> that this isn't true in the examples they've tried:  missingness does
>> get passed along.  This example shows it (this is slightly different
>> than the SO example):
>>
>> f1 <- function(x, y, z){
>>    if(missing(x))
>>      cat("f1: x is missing\n")
>>    if(missing(y))
>>      cat("f1: y is missing\n")
>> }
>>
>> f2 <- function(x, y, z){
>>    if(missing(z))
>>      cat("f2: z is missing\n")
>>    f1(x, y)
>> }
>>
>> f2()
>>
>> which produces
>>
>> f2: z is missing
>> f1: x is missing
>> f1: y is missing
>>
>> Is the documentation out of date?  That quote appears to have been
>> written in 2002.
>>
>> Duncan Murdoch
>>
>> ______________________________________________
>> R-devel at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>
>

-- 
Alexander Bertram
Technical Director
*BeDataDriven BV*

Web: http://bedatadriven.com
Email: alex at bedatadriven.com
Tel. Nederlands: +31(0)647205388
Skype: akbertram

	[[alternative HTML version deleted]]



[Rd] Is missingness always passed on?
Bertram, Alexander