В Tue, 12 Mar 2024 12:33:17 -0700
Hervé Pagès <hpages.on.git...@gmail.com> пишет:

> The acrobatics that as.data.frame.factor() is going thru in order to 
> recognize a direct call don't play nice if as.data.frame() is an S4 
> generic:
> 
>      df <- as.data.frame(factor(11:12))
> 
>      suppressPackageStartupMessages(library(BiocGenerics))
>      isGeneric("as.data.frame")
>      # [1] TRUE
> 
>      df <- as.data.frame(factor(11:12))
>      # Warning message:
>      # In as.data.frame.factor(factor(11:12)) :
>      #   Direct call of 'as.data.frame.factor()' is deprecated.

How about something like the following:

Index: src/library/base/R/zzz.R
===================================================================
--- src/library/base/R/zzz.R    (revision 86109)
+++ src/library/base/R/zzz.R    (working copy)
@@ -681,7 +681,14 @@
     bdy <- body(as.data.frame.vector)
     bdy <- bdy[c(1:2, seq_along(bdy)[-1L])] # taking [(1,2,2:n)] to insert at 
[2]:
     ## deprecation warning only when not called by method dispatch from 
as.data.frame():
-    bdy[[2L]] <- quote(if((sys.nframe() <= 1L || !identical(sys.function(-1L), 
as.data.frame)))
+    bdy[[2L]] <- quote(if((sys.nframe() <= 1L || !(
+       identical(sys.function(-1L), as.data.frame) || (
+           .isMethodsDispatchOn() &&
+           methods::is(sys.function(-1L), 'derivedDefaultMethod') &&
+           identical(
+               sys.function(-1L)@generic,
+               structure('as.data.frame', package = 'base')
+           )))))
        .Deprecated(
            msg = gettextf(
                "Direct call of '%s()' is deprecated.  Use '%s()' or
                '%s()' instead",

The patch passes make check-devel, but I'm not sure how to safely put
setGeneric('as.data.frame'); as.data.frame(factor(1:10)) in a
regression test.

-- 
Best regards,
Ivan

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to