[Rd] Is missingness always passed on?

Bertram, Alexander @|ex @end|ng |rom bed@t@dr|ven@com
Tue Oct 1 10:38:32 CEST 2019


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 using 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 using 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 using 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 using bedatadriven.com
Tel. Nederlands: +31(0)647205388
Skype: akbertram

	[[alternative HTML version deleted]]



More information about the R-devel mailing list