[Rd] [R] Definition of = vs. <-

Wacek Kusnierczyk Waclaw.Marcin.Kusnierczyk at idi.ntnu.no
Thu Apr 2 10:53:26 CEST 2009

Wacek Kusnierczyk wrote:
> and btw. the following is also weird:
>     quote(a=1)
>     # 1
> not because '=' works as named argument specifier (so that the result
> would be something like `=`(a, 1)), 

i meant to write: not because '=' does not work as an assignment
operator (or otherwise the result would be ...)

> but because quote has no parameter
> named 'a', and i would expect an error to be raised:
>     # hypothetical
>     quote(a=1)
>     # error: unused argument(s): (a = 1)
> as in, say
>     vector(mode='list', i=1)
>     # error: unused argument(s): (i = 1)
> it appears that, in fact, quite many r functions will gladly match a
> *named* argument with a *differently named* parameter.  it is weird to
> the degree that it is *wrong* wrt. the 'r language definition', sec.
> 4.3.2 'argument matching', which says:
> "The first thing that occurs in a function evaluation is the matching of
> formal to the actual or
> supplied arguments. This is done by a three-pass process:
>  1. Exact matching on tags. For each named supplied argument the list of
> formal arguments is
>      searched for an item whose name matches exactly. It is an error to
> have the same formal
>      argument match several actuals or vice versa.
>  2. Partial matching on tags. Each remaining named supplied argument is
> compared to the
>      remaining formal arguments using partial matching. If the name of
> the supplied argument
>      matches exactly with the first part of a formal argument then the
> two arguments are con-
>      sidered to be matched. It is an error to have multiple partial
> matches. Notice that if f
>      <- function(fumble, fooey) fbody, then f(f = 1, fo = 2) is illegal,
> even though the 2nd
>      actual argument only matches fooey. f(f = 1, fooey = 2) is legal
> though since the second
>      argument matches exactly and is removed from consideration for
> partial matching. If the
>      formal arguments contain ‘...’ then partial matching is only
> applied to arguments that
>      precede it.
>  3. Positional matching. Any unmatched formal arguments are bound to
> unnamed supplied
>      arguments, in order. If there is a ‘...’ argument, it will take up
> the remaining arguments,
>      tagged or not.
>    If any arguments remain unmatched an error is declared.
> "
> if you now consider the example of quote(a=1), with quote having *one*
> formal argument (parameter) named 'expr' (see ?quote), we see that:
> 1. there is no exact match between the formal 'expr' and the actual 'a'
> 2. there is no partial match between the formal 'expr' and the actual 'a'
> 3a. there is an unmatched formal argument ('expr'), but no unnamed
> actual argument.  hence, 'expr' remains unmatched. 
> 3b. there is no argument '...' (i think the r language definition is
> lousy and should say 'formal argument' here, as you can have it as an
> actual, too, as in quote('...'=1)).  hence, the actual argument named
> 'a' will not be 'taken up'.
> there remain unmatched arguments (i guess the r language definition is
> lousy and should say 'unmatched actual arguments', as you can obviously
> have unmatched formals, as in eval(1)), hence an error should be
> 'declared' (i guess 'raised' is more appropriate). 
> this does not happen in quote(a=1) (and many, many other cases), and
> this makes me infer that there is a *bug* in the implementation of
> argument matching, since it clearly does not conform to the definiton. 
> hence, i cc: to r-devel, and will also report a bug in the usual way.

More information about the R-devel mailing list