[Rd] Spurious warning in as.data.frame.factor()
Hervé Pagès
hp@ge@@on@g|thub @end|ng |rom gm@||@com
Mon Mar 18 19:36:20 CET 2024
Thanks Martin. We'll update the BioC builders to the latest R devel soon.
Cheers,
H.
On 3/15/24 10:26, Martin Maechler wrote:
>>>>>> Martin Maechler
>>>>>> on Fri, 15 Mar 2024 11:24:22 +0100 writes:
>>>>>> Ivan Krylov
>>>>>> on Thu, 14 Mar 2024 14:17:38 +0300 writes:
> >> On Thu, 14 Mar 2024 10:41:54 +0100
> >> Martin Maechler<maechler using stat.math.ethz.ch> wrote:
>
> >>> Anybody trying S7 examples and see if they work w/o producing
> >>> wrong warnings?
>
> >> It looks like this is not applicable to S7. If I overwrite
> >> as.data.frame with a newly created S7 generic, it fails to dispatch on
> >> existing S3 classes:
>
> >> new_generic('as.data.frame', 'x')(factor(1))
> >> # Error: Can't find method for `as.data.frame(S3<factor>)`.
>
> >> But there is no need to overwrite the generic, because S7 classes
> >> should work with existing S3 generics:
>
> >> foo <- new_class('foo', parent = class_double)
> >> method(as.data.frame, foo) <- function(x) structure(
> >> # this is probably not generally correct
> >> list(x),
> >> names = deparse1(substitute(x)),
> >> row.names = seq_len(length(x)),
> >> class = 'data.frame'
> >> )
> >> str(as.data.frame(foo(pi)))
> >> # 'data.frame': 1 obs. of 1 variable:
> >> # $ x: <foo> num 3.14
>
> >> So I think that is nothing to break because S7 methods for
> >> as.data.frame will rely on S3 for dispatch.
>
> > Yes, as it should be. Thank you for checking..
>
>
> >>> > 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.
> >>>
> >>> {What's the danger/problem? we do have "similar" tests in both
> >>> src/library/methods/tests/*.R
> >>> tests/reg-S4.R
> >>>
> >>> -- maybe we can discuss bi-laterally (or here, as you prefer)
> >>> }
>
> >> This might be educational for other people wanting to add a regression
> >> test to their patch. I see that tests/reg-tests-1e.R is already running
> >> under options(warn = 2), so if I add the following near line 750
> >> ("Deprecation of *direct* calls to as.data.frame.<someVector>")...
>
> >> # Should not warn for a call from a derivedDefaultMethod to the raw
> >> # S3 method -- implementation detail of S4 dispatch
> >> setGeneric('as.data.frame')
> >> as.data.frame(factor(1))
>
> >> ...then as.data.frame will remain an S4 generic. Should the test then
> >> rm(as.data.frame) and keep going? (Or even keep the S4 generic?) Is
> >> there any hidden state I may be breaking for the rest of the test this
> >> way?
> >> The test does pass like this, so this may be worrying about nothing.
>
> > Indeed, this could be educational; I think just adding
>
> > removeGeneric('as.data.frame')
>
> > is appropriate here as it is self-explaining and should not leave
> > much traces.
>
> > I'm about to test this in reg-tests-1e.R and with make check-all
> > and commit later today,
> > thanking you, Ivan!
>
> This has been committed to R-devel svn rev 86139 now.
>
> So these spurious warnings in situations where as.data.frame()
> is an S4 generic --- notably for the many Bioconductor package
> depending on {BiocGenerics} --- should disappear within 24
> hours or less.
>
> Martin
--
Hervé Pagès
Bioconductor Core Team
hpages.on.github using gmail.com
[[alternative HTML version deleted]]
More information about the R-devel
mailing list