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

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
>

	[[alternative HTML version deleted]]



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