[Rd] Is missingness always passed on?

Duncan Murdoch murdoch@dunc@n @end|ng |rom gm@||@com
Tue Oct 1 11:22:26 CEST 2019


On 01/10/2019 4:58 a.m., Serguei Sokol wrote:
> Le 30/09/2019 à 16:17, Duncan Murdoch a écrit :
>>
>> 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.
> Er, as far  as I understand the cited doc, it correctly describes what
> happened in your example: missing() is not working in a local call (here
> f1(x,y)).
> In fact, what missing() of f1 is reporting it is still the situation of
> f2() call (i.e. immediate body of the function). See
> 
> f2(y=1)
> 
> produces
> 
> f2: z is missing
> f1: x is missing
> 
> (the line about y missing disappeared from f1(x,y) call, what needed to
> be demonstrated).

Yes, that's a possible interpretation.  Another one is that missing 
should fail in this example:

f2 <- function(z){
    f1 <- function(){
      if(missing(z))
        cat("f1: z is missing\n")
    }
    f1()
}

and it does:

 > f2()
Error in missing(z) (from #3) : 'missing' can only be used for arguments

Here missing() is appearing in a nested function.  I'm really not sure 
which is the intended meaning of that paragraph:  what exactly is a 
"local call"?

Duncan Murdoch



More information about the R-devel mailing list