From luke at stat.uiowa.edu  Fri Oct 10 15:14:32 2003
From: luke at stat.uiowa.edu (Luke Tierney)
Date: Fri Oct 10 15:13:42 2003
Subject: [Rd] incorrect behaviour of formals (PR#4511)
In-Reply-To: <200310101229.h9ACTF0P024485@pubhealth.ku.dk>
Message-ID: <Pine.LNX.4.44.0310100743490.15282-100000@itasca2.stat.uiowa.edu>

On Fri, 10 Oct 2003 polzehl@wias-berlin.de wrote:

> Full_Name: J?rg Polzehl
> Version: 1.8.0
> OS: Windows XP
> Submission from: (NULL) (62.141.176.1)
> 
> 
> I encountered a problem when playing with the mle library and specifying
> negative
> starting values for the parameters. 
> The reason seems to be an incorrect behaviour of  function formals:
> 
>  glike<-function(a=1,b=1,c=1) a
> > formals(glike)
> $a
> [1] 1
> $b
> [1] 1
> $c
> [1] 1
> > unlist(formals(glike))
> a b c 
> 1 1 1 
> >  glike<-function(a=1,b=1,c= -1) a
> > formals(glike)
> $a
> [1] 1
> $b
> [1] 1
> $c
> -1
> > unlist(formals(glike))
> $a
> [1] 1
> $b
> [1] 1
> $c
> -1

formals is doing what it is supposed to do, returning the formal
argument list of the function specified.  The problem is using unlist,
which:

	Given a list structure 'x', 'unlist' simplifies it to produce a
	vector which contains all the atomic components which occur in
	'x'.

If all default argument expressions are atomic components of the same
mode then unlist can simplify. For

	> formals(function(x=g(2)) x)
	$x
	g(2)
	> unlist(formals(function(x=g(2)) x))
	$x
	g(2)

unlist cannot simplify, so it returns the original generic vector.
For your example the first two default argument expressions are
numeric values,

	> mode(formals(function(a=1,b=1,c= -1) a)$a)
	[1] "numeric"
	> mode(formals(function(a=1,b=1,c= -1) a)$b)
	[1] "numeric"

but the third is not:

	> mode(formals(function(a=1,b=1,c= -1) a)$c)
	[1] "call"
	> as.list(formals(function(a=1,b=1,c= -1) a)$c)
	[[1]]
	`-`
	
	[[2]]
	[1] 1

The entries in formals are the default argument expressions as
produced by the parser. Positive numbers are parsed to numeric
constants, but the expression -1 is parsed to a call of the unary
minus function applied to the positive value 1.

Bottom line: both formals and unlist are working as documented; code
that uses unlist(formals(...)) ans expects the result to be a numeric
vector needs to be changed.

Best,

luke

-- 
Luke Tierney
University of Iowa                  Phone:             319-335-3386
Department of Statistics and        Fax:               319-335-3017
   Actuarial Science
241 Schaeffer Hall                  email:      luke@stat.uiowa.edu
Iowa City, IA 52242                 WWW:  http://www.stat.uiowa.edu


[Rd] incorrect behaviour of formals (PR#4511)
Luke Tierney