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
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.
>
>