From @oko| @end|ng |rom |n@@-tou|ou@e@|r  Tue Oct  1 11:27:43 2019
From: @oko| @end|ng |rom |n@@-tou|ou@e@|r (Serguei Sokol)
Date: Tue, 1 Oct 2019 11:27:43 +0200
Subject: [Rd] Is missingness always passed on?
In-Reply-To: <34912961-8e67-4c78-865d-e524e207a684@insa-toulouse.fr>
References: <1fc5777f-cc96-ceb7-f2e4-4475622ce77b-860@gmail.com>
 <34912961-8e67-4c78-865d-e524e207a684@insa-toulouse.fr>
Message-ID: <d4df4d3e-48b3-40b3-64ad-75f8d6c87709@insa-toulouse.fr>

Le 01/10/2019 ? 10:58, Serguei Sokol a ?crit?:
> 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).
Re-er, it seem that I was a little bit to fast in my conclusion. If we 
modify f2 to be

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

then f2() call gives

f2: z is missing
f1: y is missing

i.e. missing() of f1(x=1,y) call is reporting its own situation, not 
those of f2(). And the missingess of y seems to be inherited from f2() call.
Sorry to be hasty.

Serguei.



[Rd] Is missingness always passed on?
Serguei Sokol