[Rd] Compatibility issues caused by new simplify argument in apply function
Duncan Murdoch
murdoch@dunc@n @end|ng |rom gm@||@com
Fri May 22 18:28:45 CEST 2020
On 22/05/2020 11:47 a.m., Henrik Bengtsson wrote:
> 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) {
>
> ?
Yes, that sounds like an ideal solution. The docs can say it is ignored
in old versions and passed on in new ones.
Duncan Murdoch
>
> 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