[Rd] utils::isS3stdGeneric chokes on primitives and identity
Kurt Hornik
Kurt@Horn|k @end|ng |rom wu@@c@@t
Thu Aug 20 09:58:16 CEST 2020
>>>>> 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
More information about the R-devel
mailing list