[R] debugging substitute function in R 2.11

Peter Ehlers ehlers at ucalgary.ca
Sun May 16 00:42:35 CEST 2010


substitute() does not have an argument 'list'; it does have 'env'.

Replace this line:

             list = list (member = as.name (member),

with

             env = list (member = as.name (member),

  -Peter Ehlers

On 2010-05-14 3:09, Gil Tomás wrote:
> Dear list,
>
> A while ago I found in the web a function (sadly I can't credit the
> author as I don't remember where I picked it up from) whose output is
> a dataframe that lists for every object in the global environment its
> class, mode, dim&  length (where applicable). It is meant to be an
> upgrade to the ls () function with a far more informative and detailed
> output and it quickly became one of my most frequent calls in any R
> session (source added to my .Rprofile). However, since I upgraded to R
> 2.11, the function stopped working, retrieving the following error:
>
> ******
> R>  ll ()
> Error in substitute({ :
>    unused argument(s) (list = list(member = as.name(member), property =
> property, fcn = as.name(property)))
> ******
>
> This seems to be due to a change in the substitute function in R 2.11,
> as described in the release notes:
>
> ******
> Primitive functions UseMethod(), attr(), attr<-(), on.exit(),
> 	retracemem() and substitute() now use standard argument
> 	matching (rather than positional matching).  This means that
> 	all multi-argument primitives which are not internal now use
> 	standard argument matching except where positional matching is
> 	desirable (as for switch(), call(), .C() ...).
> ******
>
> I've tried to debug it myself, but unfortunately my knowledge of R is
> not deep enough to find a compatible version of the function with R
> 2.11 yet. Here is the ll () function:
>
> ******
> ll<- function() {
>    df<- NULL
>    envir<- parent.frame ()
>    for (member in ls (envir = envir))
>      {
>        oneRow<- list (member = member)
>        for (property in c ("class", "mode", "dim", "length"))
>          {
>            value<- eval (substitute ( # this is the call producing the
> error in R 2.11
>                                       {
>                                         fcn<- get (property, mode = "function")
>                                         fcn (member)
>                                       },
>                                       list = list (member = as.name (member),
>                                         property = property,
>                                         fcn = as.name (property))
>                                       ),
>                           envir = envir)
>        if (is.null (value))
>          value<- "NULL"
>        else if (is.vector (value)&&  length (value)>  1)
>          value<- sprintf ("c(%s)", paste (value, collapse = ","))
>        else if (is.list (value))
>          value<- unlist (value)
>        if (length (value)>  0)
>          value<- value[1]
>        value<- as.character (value)
>            oneRow[[property]]<- value
>          }
>        df<- rbind (df, as.data.frame (oneRow))
>      }
>    df
> }
> ******
>
> Could anyone give me a hint as how to tweak the substitute call to
> render it compatible with R 2.11?
>
> Any help greatly appreciated,
> Gil
>
> ______________________________________________
> R-help at r-project.org mailing list
> 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.
>
>



More information about the R-help mailing list