[R] Subset with missing argument within a function

William Dunlap wdunlap at tibco.com
Fri Feb 5 16:39:32 CET 2016


R's subscripting operators do not "guess" the value of a missing
argument: a missing k'th subscript means seq_len(dim(x)[k]).
I bet that you use syntax like x[,1] (the entire first column of x)
all the time and that you don't want this syntax to go away.

Some languages use a placeholder like '.' or '*' to do this.  Perhaps
S should have, but it is now late to make such a change.



Bill Dunlap
TIBCO Software
wdunlap tibco.com

On Thu, Feb 4, 2016 at 11:23 PM, Stefano de Pretis <ste.depo.bio at gmail.com>
wrote:

> Thanks Bill,
>
> This is more clear.
>
> In any case, I find very inappropriate that a programming language tries
> to guess the value of a missing argument. It is unfair towards code
> developers and it promotes the production of bugged piece of software.
>
> I hope R will revise its policies sooner or later.
>
> Thanks for the discussion,
>
> Stefano
>
>
>
>
>
>
>
> 2016-02-04 18:19 GMT+01:00 William Dunlap <wdunlap at tibco.com>:
>
>> The "missingness" of an argument gets passed down through nested function
>> calls.  E.g.,
>>   fOuter <- function(x) c(outerMissing=missing(x), innerMissing=fInner(x))
>>   fInner <- function(x) missing(x)
>>   fInner()
>>   #[1] TRUE
>>   fOuter()
>>   #outerMissing innerMissing
>>   #      TRUE         TRUE
>> It is only when a function evaluates an argument that you get a message
>> like 'argument is missing, with no default'.  ('[' checks for missingness
>> before
>> evaluating a subscript argument so it will not give that error.)
>>
>>
>> Bill Dunlap
>> TIBCO Software
>> wdunlap tibco.com
>>
>> On Thu, Feb 4, 2016 at 7:47 AM, Stefano de Pretis <ste.depo.bio at gmail.com
>> > wrote:
>>
>>> Hi Petr,
>>>
>>> Thank you for your answer.
>>>
>>> I'm not sure how the empty index reflects what I'm showing in my example.
>>> If my function was
>>>
>>> emptySubset <- function(vec) vec[]
>>>
>>> I would then agree that this was the case. But I think it's different:
>>> I'm
>>> specifically telling my function that it should have two arguments ("vec"
>>> and "ix")
>>>
>>> subsettingFun <- function(vec, ix) vec[ix]
>>>
>>> and I guess why, within the function, it does not happen what happens on
>>> the command line:
>>>
>>> > ix
>>> Error: object 'ix' not found
>>> > letters[ix]
>>> Error: object 'ix' not found
>>>
>>> My "expectation" came from a matter of coherence, but probably I'm still
>>> missing something.
>>>
>>> Regards,
>>>
>>> Stefano
>>>
>>>
>>>
>>> 2016-02-04 15:39 GMT+01:00 PIKAL Petr <petr.pikal at precheza.cz>:
>>>
>>> > Hi
>>> >
>>> > Help page for ?"[" says
>>> >
>>> > An empty index selects all values: this is most often used to replace
>>> all
>>> > the entries but keep the attributes.
>>> >
>>> > and actually you function construction works with empty index
>>> >
>>> > > x<-c(1,2,5)
>>> > > letters[x]
>>> > [1] "a" "b" "e"
>>> > > letters[]
>>> >  [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p"
>>> "q"
>>> > "r" "s"
>>> > [20] "t" "u" "v" "w" "x" "y" "z"
>>> >
>>> > It is sometimes useful not "expect" the program behavior but "inspect"
>>> why
>>> > it behaves differently.
>>> >
>>> > If you want your function to throw error when some arguments are
>>> missing
>>> > you need to do the check yourself and not rely on programming language.
>>> >
>>> > And BTW I did not know an answer before I inspected docs.
>>> >
>>> > Cheers
>>> > Petr
>>> >
>>> >
>>> > > -----Original Message-----
>>> > > From: R-help [mailto:r-help-bounces at r-project.org] On Behalf Of
>>> Stefano
>>> > > de Pretis
>>> > > Sent: Thursday, February 04, 2016 11:00 AM
>>> > > To: r-help at r-project.org
>>> > > Subject: [R] Subset with missing argument within a function
>>> > >
>>> > > Hi all,
>>> > >
>>> > > I'm guessing what's the rationale behind this:
>>> > >
>>> > > > subsettingFun <- function(vec, ix) vec[ix]
>>> > > > subsettingFun(letters, c(1,2,5))
>>> > > [1] "a" "b" "e"
>>> > > > subsettingFun(letters)
>>> > >  [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p"
>>> > > "q"
>>> > > "r" "s"
>>> > > [20] "t" "u" "v" "w" "x" "y" "z"
>>> > >
>>> > > If the argument "ix" is missing, I'm expecting an error not to return
>>> > > the
>>> > > variable "vec" as it is.
>>> > >
>>> > > I think this is VERY dangerous and does not help the development of
>>> > > reliable code and the debugging.
>>> > >
>>> > > Cheers,
>>> > >
>>> > > Stefano
>>> > >
>>> > > *Center for Genomic Science of IIT at SEMM*
>>> > >
>>> > > Stefano de Pretis, PhD
>>> > >
>>> > > *Postdoctoral fellow *
>>> > >
>>> > >       [[alternative HTML version deleted]]
>>> > >
>>> > > ______________________________________________
>>> > > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
>>> > > https://stat.ethz.ch/mailman/listinfo/r-help
>>> > > PLEASE do read the posting guide http://www.R-project.org/posting-
>>> > > guide.html
>>> > > and provide commented, minimal, self-contained, reproducible code.
>>> >
>>> > ________________________________
>>> > Tento e-mail a jakékoliv k němu připojené dokumenty jsou důvěrné a jsou
>>> > určeny pouze jeho adresátům.
>>> > Jestliže jste obdržel(a) tento e-mail omylem, informujte laskavě
>>> > neprodleně jeho odesílatele. Obsah tohoto emailu i s přílohami a jeho
>>> kopie
>>> > vymažte ze svého systému.
>>> > Nejste-li zamýšleným adresátem tohoto emailu, nejste oprávněni tento
>>> email
>>> > jakkoliv užívat, rozšiřovat, kopírovat či zveřejňovat.
>>> > Odesílatel e-mailu neodpovídá za eventuální škodu způsobenou
>>> modifikacemi
>>> > či zpožděním přenosu e-mailu.
>>> >
>>> > V případě, že je tento e-mail součástí obchodního jednání:
>>> > - vyhrazuje si odesílatel právo ukončit kdykoliv jednání o uzavření
>>> > smlouvy, a to z jakéhokoliv důvodu i bez uvedení důvodu.
>>> > - a obsahuje-li nabídku, je adresát oprávněn nabídku bezodkladně
>>> přijmout;
>>> > Odesílatel tohoto e-mailu (nabídky) vylučuje přijetí nabídky ze strany
>>> > příjemce s dodatkem či odchylkou.
>>> > - trvá odesílatel na tom, že příslušná smlouva je uzavřena teprve
>>> > výslovným dosažením shody na všech jejích náležitostech.
>>> > - odesílatel tohoto emailu informuje, že není oprávněn uzavírat za
>>> > společnost žádné smlouvy s výjimkou případů, kdy k tomu byl písemně
>>> zmocněn
>>> > nebo písemně pověřen a takové pověření nebo plná moc byly adresátovi
>>> tohoto
>>> > emailu případně osobě, kterou adresát zastupuje, předloženy nebo jejich
>>> > existence je adresátovi či osobě jím zastoupené známá.
>>> >
>>> > This e-mail and any documents attached to it may be confidential and
>>> are
>>> > intended only for its intended recipients.
>>> > If you received this e-mail by mistake, please immediately inform its
>>> > sender. Delete the contents of this e-mail with all attachments and its
>>> > copies from your system.
>>> > If you are not the intended recipient of this e-mail, you are not
>>> > authorized to use, disseminate, copy or disclose this e-mail in any
>>> manner.
>>> > The sender of this e-mail shall not be liable for any possible damage
>>> > caused by modifications of the e-mail or by delay with transfer of the
>>> > email.
>>> >
>>> > In case that this e-mail forms part of business dealings:
>>> > - the sender reserves the right to end negotiations about entering
>>> into a
>>> > contract in any time, for any reason, and without stating any
>>> reasoning.
>>> > - if the e-mail contains an offer, the recipient is entitled to
>>> > immediately accept such offer; The sender of this e-mail (offer)
>>> excludes
>>> > any acceptance of the offer on the part of the recipient containing any
>>> > amendment or variation.
>>> > - the sender insists on that the respective contract is concluded only
>>> > upon an express mutual agreement on all its aspects.
>>> > - the sender of this e-mail informs that he/she is not authorized to
>>> enter
>>> > into any contracts on behalf of the company except for cases in which
>>> > he/she is expressly authorized to do so in writing, and such
>>> authorization
>>> > or power of attorney is submitted to the recipient or the person
>>> > represented by the recipient, or the existence of such authorization is
>>> > known to the recipient of the person represented by the recipient.
>>> >
>>>
>>>         [[alternative HTML version deleted]]
>>>
>>> ______________________________________________
>>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
>>> https://stat.ethz.ch/mailman/listinfo/r-help
>>> PLEASE do read the posting guide
>>> http://www.R-project.org/posting-guide.html
>>> and provide commented, minimal, self-contained, reproducible code.
>>
>>
>>
>

	[[alternative HTML version deleted]]



More information about the R-help mailing list