[Rd] Compatibility issues caused by new simplify argument in apply function

Henrik Bengtsson henr|k@bengt@@on @end|ng |rom gm@||@com
Fri May 22 17:47:00 CEST 2020


Interesting problem.  I'm very rusty on S4 but would one solution be
to, already now, add 'simplify = TRUE' to the S4 method and document
it;

setMethod("apply", signature(X = "Speclib"),
          function(X,
                   FUN,
                   bySI = NULL,
                   ...,
                   simplify = TRUE) {

?

Henrik

On Fri, May 22, 2020 at 6:26 AM Duncan Murdoch <murdoch.duncan using gmail.com> wrote:
>
> You didn't explained what the error is.  This is what it looks like to
> me, but I'm probably wrong in some details:
>
> 1. R-devel added an argument to the apply() function, so the header has
> changed from
>
>    function (X, MARGIN, FUN, ...)
>
> to
>
>    function(X, MARGIN, FUN, ..., simplify = TRUE)
>
> 2. Your package converted the function apply() to an S4 generic.
>
> 3. Now the signatures of your methods for this generic need to have the
> simplify argument, but if you do that, they won't work in previous
> versions of R.
>
> You'd like to have conditional code and documentation to depend on the
> version of R.
>
> Is that all correct?
>
> I don't think it's possible, for the reasons you found.  Certainly you
> can have conditional code, but the docs are going to fail.
>
> One thing that might work is in versions of R before this change, export
> your own version of apply, with the change in place, i.e.
>
> if(!("simplify" %in% names(formals(base::apply))))
>    apply <- function(X, MARGIN, FUN, ..., simplify = TRUE) {
>      base::apply(X, MARGIN, FUN, ...)
>    }
>
> and then conditionally export "apply" in these old versions.  Then your
> docs could match the new version everywhere.
>
> Another thing is to maintain two versions of your package, one for R
> versions before the change, another for versions after the change.  Add
> appropriate entries in the DESCRIPTION file, e.g.
>
> Depends:  R (> 4.0)
>
> Another is to argue with R Core that this change to a really old
> function is too hard to accommodate, and they should back it out, maybe
> by making a new function with the new signature.
>
> Or you could make a new function with the old signature, and use that
> instead of apply().
>
> Duncan Murdoch
>
>
>
> On 22/05/2020 6:26 a.m., Lukas Lehnert via R-devel wrote:
> > Dear R Developers,
> >
> > the new  simplify argument in apply causes that my package (hsdar) does not
> > pass the
> > checks in R-devel.
> >
> > The workaround, Kurt Hornik send me, is working for the R-code:
> > if("simplify" %in% names(formals(base::apply)))
> >   do something
> > else
> >   do something else
> >
> > Unfortunately, I cannot conditionalize the man pages of the functions. I get
> > the message
> > that "applySpeclib.Rd:12-14: Section \Sexpr is unrecognized and will be
> > dropped" if I try to
> > dynamically define the entire usage section. If I try to use \Sexpr inside the
> > \usage section,
> > I get the following warning: "applySpeclib.Rd:13-15: Tag \Sexpr is invalid in
> > a \usage block"
> >
> > Does anybody have an idea how to proceed. The full code is available below.
> >
> > Thanks
> >
> > Lukas
> >
> >
> > *1. Code for full usage section:*
> > ..
> > \description{
> > Apply function over all spectra or a subset of spectra in a \code{Speclib}.
> > }
> >
> > \Sexpr[echo=TRUE,results=rd,stage=install]{
> >    hsdar:::.applyInHelp1("Speclib", usage = TRUE)
> > }
> >
> > \arguments{
> > ..
> >
> > *Function .applyInHelp1*
> > .applyInHelp1 <- function(fun_name, usage)
> > {
> >    if (usage)
> >    {
> >      if ("simplify" %in% names(formals(base::apply)))
> >      {
> >        return(paste0("\\usage{\n",
> >                      "\\S4method{apply}{", fun_name, "}(X, MARGIN, FUN, ...,
> > simplify = TRUE)\n",
> >                      "}"))
> >      } else {
> >        return(paste0("\\usage{\n",
> >                      "\\S4method{apply}{", fun_name, "}(X, MARGIN, FUN, ...)
> > \n",
> >                      "}"))
> >      }
> >    } else {
> >      if ("simplify" %in% names(formals(base::apply)))
> >      {
> >        return("}\n\\item{simplify}{Currently ignored")
> >      } else {
> >        return("")
> >      }
> >    }
> > }
> >
> >
> > *2. Using \Sexpr inside the \usage block*
> > \usage{
> > \S4method{apply}{Speclib}(X, FUN, bySI = NULL, ...
> > \Sexpr[echo=TRUE,results=rd,stage=install]{
> >    hsdar:::.applyInHelp2(usage = TRUE)
> > }
> > )
> > }
> >
> >
> > *Function .applyInHelp2*
> > .applyInHelp2 <- function(usage)
> > {
> >    if (usage)
> >    {
> >      if ("simplify" %in% names(formals(base::apply)))
> >      {
> >        return(", simplify = TRUE)")
> >      }
> >    } else {
> >      if ("simplify" %in% names(formals(base::apply)))
> >      {
> >        return("}\n\\item{simplify}{Currently ignored")
> >      } else {
> >        return("")
> >      }
> >    }
> > }
> >
> > ______________________________________________
> > R-devel using r-project.org mailing list
> > https://stat.ethz.ch/mailman/listinfo/r-devel
> >
>
> ______________________________________________
> R-devel using r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel



More information about the R-devel mailing list