[R-pkg-devel] Redefinition of generic for plot function breaks plot.formula

Benjamin Hofner benjamin.hofner at fau.de
Tue Sep 1 18:01:45 CEST 2015


Dear Gavin,

you and Hadley seem to be right. It looks like a problem which is buried 
deeper within R and the method dispatch. It seems like I have to 
reintroduce the class labeled.data.frame and plot.labeled.data.frame.

However, I will post on R-devel to try to understand this issue.

Thanks a lot!
Benjamin

Am 01.09.2015 um 17:54 schrieb Gavin Simpson:
> It's not just plot.formula that is broken; plot.lm is dead too for
> example. It's seems that just unexported methods fail to be called. This
> works plot(ts(1:100)), correctly calling the plot.ts method.
>
> What you must be doing overwriting the plot generic seems to be
> clobbering S3 dispatch or killing the registration of those methods such
> that they never get called.
>
> I think you might need to take this to R Devel to ask what is happening
> to S3 dispatch when you modify the generic (by providing your own),
> unless someone else here knows what is going on?
>
> If this isn't a problem in R, it looks like it would be easier all round
> to follow Prof. Ripley's other advice/option and add a new class to
> data.frame objects and provide a method for that new class...
>
> HTH
>
> G
>
> On 1 September 2015 at 07:53, Benjamin Hofner <benjamin.hofner at fau.de
> <mailto:benjamin.hofner at fau.de>> wrote:
>
>     I am using it this way as I want to be able to plot data.frames but
>     have a better display and more options. Thus, using plot.data.frame
>     seems rather natural. A different function or new classes are just a
>     work around. I do not want to use a new class as these functions
>     should work on ANY data frame without coercion.
>
>     Additionally, I had the function plot.data.frame [*] in an old
>     versions of the package and would like to keep it for backward
>     compatibility.
>
>     [*] admittedly the function was plot.labeled.data.frame but I
>     dropped the class labeled.data.frame as all my functions now work on
>     regular data frames as well. If labels are present, these are used.
>     If not, not.
>
>     Benjamin
>
>     Am 01.09.2015 um 15:44 schrieb Gavin Simpson:
>
>         ...or have an object that is a data.frame but to which you add an
>         additional class
>
>         class(obj) <- c("my_df", "data.frame")
>
>         Then you can include plot.my_df() in your package, plus a
>         function to
>         create a my_df object from a data frame, and you don't have to worry
>         about all this and your objects will still work like data frames
>
>         G
>
>         On Sep 1, 2015 07:15, "Hadley Wickham" <h.wickham at gmail.com
>         <mailto:h.wickham at gmail.com>
>         <mailto:h.wickham at gmail.com <mailto:h.wickham at gmail.com>>> wrote:
>
>              Why don't you just create your own function?
>
>              Hadley
>
>              On Tue, Sep 1, 2015 at 8:08 AM, Benjamin Hofner
>              <benjamin.hofner at fau.de <mailto:benjamin.hofner at fau.de>
>         <mailto:benjamin.hofner at fau.de <mailto:benjamin.hofner at fau.de>>>
>         wrote:
>               > Dear Gavin,
>               >
>               > unfortunately, I cannot overwrite plot.data.frame only.
>         If I do
>              this I
>               > get the following warning from R CMD check:
>               >
>               > * checking use of S3 registration ... WARNING
>               > Registered S3 method from a standard package overwritten
>         by 'papeR':
>               > method from
>               > plot.data.frame graphics
>               >
>               > The reason for this is given in the following statement
>         by Prof.
>              Ripley:
>               >
>               >> Do not replace registered S3 methods from
>         base/recommended packages,
>               >> something which is not allowed by the CRAN policies and
>         will mean
>               >> that everyone gets your method even if your namespace
>         is unloaded.
>               >
>               > The route I am taking is one of the advised routes to go
>         (see
>               > https://github.com/hofnerb/papeR/issues/5). So I am
>         still looking
>              for a fix
>               > of this issue.
>               >
>               > Your warning regarding the changed user experience is
>         well noted.
>              However, I
>               > think (and am aware that this is my personal opinion)
>         that a lot
>              of users
>               > will not miss the standard plot.data.frame method which
>         is only
>              well defined
>               > for numerics anyway and not very informative in many
>         situations.
>              After your
>               > comment I am thinking of adding an option to my
>         plot.data.frame
>              function
>               > which allows to fall back to the original user experience.
>               >
>               > Thanks,
>               > Benjamin
>               >
>               > Am 01.09.2015 um 04:37 schrieb Gavin Simpson:
>               >>
>               >> Why do you even need to take over `plot`,
>         `plot.default`? You
>              can just
>               >> register/export the plot.data.frame method from our
>         package without
>               >> touching the generic or default method. The part of WRE
>         that you
>              refer
>               >> to is about making functions that are *not* S3 methods
>         in one of
>              base R
>               >> or it's packages into S3 generics. You are just providing a
>              method for
>               >> an existing generic so you don't need to follow that code.
>               >>
>               >> That said, it wouldn't be good form to fundamentally
>         alter the way
>               >> plot.data.frame worked as users might expect certain
>         functionality.
>               >>
>               >> HTH
>               >>
>               >> G
>               >>
>               >> On 31 August 2015 at 04:03, Benjamin Hofner
>              <benjamin.hofner at fau.de <mailto:benjamin.hofner at fau.de>
>         <mailto:benjamin.hofner at fau.de <mailto:benjamin.hofner at fau.de>>
>               >> <mailto:benjamin.hofner at fau.de
>         <mailto:benjamin.hofner at fau.de> <mailto:benjamin.hofner at fau.de
>         <mailto:benjamin.hofner at fau.de>>>>
>
>              wrote:
>               >>
>               >>     Dear all,
>               >>
>               >>     CRAN policies do not allow that single methods (for
>         generic
>               >>     functions) which are defined in base or recommended
>         packages are
>               >>     replaced. They advice package authors to replace
>         the standard
>               >>     generic and use a xxx.default method which then
>         calls the
>              original
>               >>     standard generic.
>               >>
>               >>     Using the following code
>               >>
>               >>
>               >>     ## overwrite standard generic
>               >>     plot <- function(x, y, ...)
>               >>          UseMethod("plot")
>               >>
>               >>     ## per default fall back to standard generic
>               >>     plot.default <- function(x, y, ...)
>               >>          graphics::plot(x, y, ...)
>               >>
>               >>     ## now specify modified plot function for data frames
>               >>     plot.data.frame <- function(x, variables =
>         names(x), ...)
>               >>
>               >>
>               >>     essentially works for all tested plot.xxx
>         functions. Yet, it
>              breaks
>               >>     plot.formula. How can I proceed to overwrite
>         plot.data.frame
>              without
>               >>     breaking plot.formula. Any help is greatly appreciated.
>               >>
>               >>     For a detailed description of the problem with syntax
>              highlighting
>               >>     and code to reproduce the problem please see:
>               >>
>               >>
>               >>
>         http://stackoverflow.com/questions/32246361/redefinition-of-generic-for-plot-function-breaks-plot-formula
>               >>
>               >>     Best,
>               >>     Benjamin
>               >>     --
>               >>
>               >>
>
>         ******************************************************************************
>               >>     Dr. rer. nat. Benjamin Hofner
>               >>
>               >>     Institut für Medizininformatik, Biometrie und
>         Epidemiologie
>               >>     Friedrich-Alexander-Universität Erlangen-Nürnberg
>               >>     Waldstr. 6 - 91054 Erlangen - Germany
>               >>
>               >>     Tel: +49-9131-85-22707 <tel:%2B49-9131-85-22707>
>         <tel:%2B49-9131-85-22707>
>              <tel:%2B49-9131-85-22707>
>               >>     Fax: +49-9131-85-25740 <tel:%2B49-9131-85-25740>
>         <tel:%2B49-9131-85-25740>
>              <tel:%2B49-9131-85-25740>
>               >>
>               >>     Büro:
>               >>        Raum 3.036
>               >>        Universitätsstraße 22
>               >>        (Eingang linke Seite des Gebäudes; Wegweiser IMBE)
>               >>
>               >> benjamin.hofner at fau.de <mailto:benjamin.hofner at fau.de>
>         <mailto:benjamin.hofner at fau.de <mailto:benjamin.hofner at fau.de>>
>              <mailto:benjamin.hofner at fau.de
>         <mailto:benjamin.hofner at fau.de> <mailto:benjamin.hofner at fau.de
>         <mailto:benjamin.hofner at fau.de>>>
>               >>
>               >>
>         http://www.imbe.med.uni-erlangen.de/cms/benjamin_hofner.html
>               >> http://www.benjaminhofner.de
>               >>
>               >>     ______________________________________________
>               >> R-package-devel at r-project.org
>         <mailto:R-package-devel at r-project.org>
>              <mailto:R-package-devel at r-project.org
>         <mailto:R-package-devel at r-project.org>>
>              <mailto:R-package-devel at r-project.org
>         <mailto:R-package-devel at r-project.org>
>              <mailto:R-package-devel at r-project.org
>         <mailto:R-package-devel at r-project.org>>>
>               >>     mailing list
>               >> https://stat.ethz.ch/mailman/listinfo/r-package-devel
>               >>
>               >>
>               >>
>               >>
>               >> --
>               >> Gavin Simpson, PhD
>               >
>               >
>               > ______________________________________________
>               > R-package-devel at r-project.org
>         <mailto:R-package-devel at r-project.org>
>              <mailto:R-package-devel at r-project.org
>         <mailto:R-package-devel at r-project.org>> mailing list
>               > https://stat.ethz.ch/mailman/listinfo/r-package-devel
>
>
>
>              --
>         http://had.co.nz/
>
>
>     --
>     ******************************************************************************
>     Dr. rer. nat. Benjamin Hofner
>
>     Institut für Medizininformatik, Biometrie und Epidemiologie
>     Friedrich-Alexander-Universität Erlangen-Nürnberg
>     Waldstr. 6 - 91054 Erlangen - Germany
>
>     Tel: +49-9131-85-22707 <tel:%2B49-9131-85-22707>
>     Fax: +49-9131-85-25740 <tel:%2B49-9131-85-25740>
>
>     Büro:
>        Raum 3.036
>        Universitätsstraße 22
>        (Eingang linke Seite des Gebäudes; Wegweiser IMBE)
>
>     benjamin.hofner at fau.de <mailto:benjamin.hofner at fau.de>
>
>     http://www.imbe.med.uni-erlangen.de/cms/benjamin_hofner.html
>     http://www.benjaminhofner.de
>     ******************************************************************************
>
>
>
>
> --
> Gavin Simpson, PhD

-- 
******************************************************************************
Dr. rer. nat. Benjamin Hofner

Institut für Medizininformatik, Biometrie und Epidemiologie
Friedrich-Alexander-Universität Erlangen-Nürnberg
Waldstr. 6 - 91054 Erlangen - Germany

Tel: +49-9131-85-22707
Fax: +49-9131-85-25740

Büro:
   Raum 3.036
   Universitätsstraße 22
   (Eingang linke Seite des Gebäudes; Wegweiser IMBE)

benjamin.hofner at fau.de

http://www.imbe.med.uni-erlangen.de/cms/benjamin_hofner.html
http://www.benjaminhofner.de



More information about the R-package-devel mailing list