Skip to content

as.list(subclassed function) -> cannot coerce type 'closure' to vector of type 'list'

3 messages · William Dunlap, Luke Tierney, Brian Ripley

#
I was looking for all the glm-related 'family' functions
in stats using the following predicate that returns TRUE
for any function whose first argument is called "link".
   is.family <- function(object) is.function(object) &&
            identical(names(as.list(object))[1], "link")

It threw an error when applied to SSfol
   > is.family(SSfol)
   Error in as.vector(x, "list") :
     cannot coerce type 'closure' to vector of type 'list'
but works when I unclass SSfol
   > is.family(unclass(SSfol))
   [1] FALSE

It looks like as.list fails on any function that is assigned
a class:
   > as.list(function(x)x+1)
   $x
   
   
   [[2]]
   x + 1

   > as.list(structure(function(x)x+1, class="unrecognized class name"))
   Error in as.vector(x, "list") :
     cannot coerce type 'closure' to vector of type 'list'

Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com
#
For this application I would use names(formals(object)) to extract the
formal arguments.

luke
On Mon, 7 Feb 2011, William Dunlap wrote:

            

  
    
#
This is because there is an as.list.function, but your classed object 
does not inherit from 'function'.

However, I think coercing to a list is S-like, and in R we have 
formals() and body(), and I think you want the former.

Seems this was a late 2008 change: maybe the author can tell us why it 
was done?
On Mon, 7 Feb 2011, William Dunlap wrote: