From bhh at xs4all.nl  Mon Aug 25 18:49:49 2014
From: bhh at xs4all.nl (Berend Hasselman)
Date: Mon, 25 Aug 2014 18:49:49 +0200
Subject: [Rd] dubious behaviour of match.arg() with nested functions.
In-Reply-To: <CAO1zAVb_R22qDehCxzn7WCJhbPTYw8+aWYWzqM4KZEUJaTEnpg@mail.gmail.com>
References: <CAO1zAVb_R22qDehCxzn7WCJhbPTYw8+aWYWzqM4KZEUJaTEnpg@mail.gmail.com>
Message-ID: <5B378047-E835-4AA2-80FD-214E782E575C@xs4all.nl>


On 25-08-2014, at 16:27, Joris Meys <jorismeys at gmail.com> wrote:

> Dear all,
> 
> I initially ran into this problem while rebuilding a package dependent on
> nleqslv. I got the following error:
> 
> Error in match.arg(global) : 'arg' must be of length 1
> 
> This didn't occur in previous versions of nleqslv, but did in the current
> one (2.4). I think I pinned the problem down to the following example:
> 
> Take two functions:
> 
> test <- function(x=c("q","r","s"),global=c("d","e","r","z","q")){
>  x <- match.arg(x)
>  global <- match.arg(global)
>  return(list(x,global))
> }
> 
> test2 <- function(x=c("q","r","s"),global=c("d","z","q")){
>  test(x=x,global=global)
> }
> 

Can?t  the problem easily be avoided by using a slightly modified version of the test2() function?

test2 <- function(x=c("q","r","s"),global=c("d","z","q")){
 x <- match.arg(x)
global <- match.arg(global)
 test(x=x,global=global)
}

Then test2() would be calling test() as it was intended to be called.
I?ve tried that and it appears to solve the problem.

So before calling nleqslv within another function use match.arg on those arguments with the same name and different defaults.
And (possibly) document that some arguments expect a single value.

Berend



[Rd] dubious behaviour of match.arg() with nested functions.
Berend Hasselman