[Rd] utils::isS3stdGeneric chokes on primitives and identity
Antoine Fabri
@nto|ne@|@br| @end|ng |rom gm@||@com
Thu Aug 27 20:22:32 CEST 2020
Should it work on traced functions ?
As it is now it doesn't.
Best,
Antoine
Le jeu. 20 août 2020 à 09:58, Kurt Hornik <Kurt.Hornik using wu.ac.at> a écrit :
> >>>>> Gabriel Becker writes:
>
> > I added that so I can look at the proposed fix and put it or something
> > similar in bugzilla for review final review.
>
> > Apologies for the oversight.
>
> Fixed now with
>
> - while(as.character(bdexpr[[1L]]) == "{")
> + while(is.call(bdexpr) && (as.character(bdexpr[[1L]]) == "{"))
>
> (the suggested fix does not work on things like
> foo <- function(x) {{ x }}
> ...)
>
> Best
> -k
>
> > ~G
>
> > On Wed, Aug 19, 2020 at 3:40 PM Antoine Fabri <antoine.fabri using gmail.com>
> > wrote:
>
> >> Dear R-devel,
> >>
> >> utils::isS3stdGeneric tries to subset the body of the function it's fed,
> >> primitives don't like that because they don't have a body, identity
> doesn't
> >> like it either because it's body is a symbol.
> >>
> >> According to the doc, any function is a legal input.
> >>
> >> See below:
> >>
> >> identity
> >> #> function (x)
> >> #> x
> >> #> <bytecode: 0x0000000013d6da28>
> >> #> <environment: namespace:base>
> >>
> >> max
> >> #> function (..., na.rm = FALSE) .Primitive("max")
> >>
> >> isS3stdGeneric(identity)
> >> #> Error in bdexpr[[1L]]: objet de type 'symbol' non indiçable
> >>
> >> isS3stdGeneric(max)
> >> #> Error in while (as.character(bdexpr[[1L]]) == "{") bdexpr <-
> >> bdexpr[[2L]]: l'argument est de longueur nulle
> >>
> >> Here is a simple fix :
> >>
> >> isS3stdGeneric <- function(f) {
> >> {
> >> bdexpr <- body(f)
> >> if(is.null(bdexpr) || !is.call(bdexpr)) return(FALSE)
> >> while (as.character(bdexpr[[1L]]) == "{") bdexpr <- bdexpr[[2L]]
> >> ret <- is.call(bdexpr) && identical(bdexpr[[1L]], as.name
> >> ("UseMethod"))
> >> if (ret)
> >> names(ret) <- bdexpr[[2L]]
> >> ret
> >> }
> >> }
> >>
> >> isS3stdGeneric(identity)
> >> #> [1] FALSE
> >> isS3stdGeneric(max)
> >> #> [1] FALSE
> >>
> >> Best,
> >>
> >> Antoine
> >>
> >> [[alternative HTML version deleted]]
> >>
> >> ______________________________________________
> >> R-devel using r-project.org mailing list
> >> https://stat.ethz.ch/mailman/listinfo/r-devel
> >>
>
> > [[alternative HTML version deleted]]
>
> > ______________________________________________
> > R-devel using r-project.org mailing list
> > https://stat.ethz.ch/mailman/listinfo/r-devel
>
[[alternative HTML version deleted]]
More information about the R-devel
mailing list