I still observe this error and just want to ping this thread so we don't forget it. Should I add this to https://bugs.r-project.org/bugzilla/ so it's tracked there?
This thread in the archives: * https://stat.ethz.ch/pipermail/r-devel/2019-June/078049.html * https://stat.ethz.ch/pipermail/r-devel/2019-July/078115.html * https://stat.ethz.ch/pipermail/r-devel/2019-July/078126.html /Henrik On Sat, Jun 29, 2019 at 1:45 PM Martin Maechler <maech...@stat.math.ethz.ch> wrote: > > >>>>> Martin Maechler > >>>>> on Sat, 29 Jun 2019 12:05:49 +0200 writes: > > >>>>> Martin Maechler > >>>>> on Sat, 29 Jun 2019 10:33:10 +0200 writes: > > >>>>> peter dalgaard > >>>>> on Fri, 28 Jun 2019 16:20:03 +0200 writes: > > >>> > On 28 Jun 2019, at 16:03 , Martin Maechler > <maech...@stat.math.ethz.ch> wrote: > >>> > > >>> >>>>>> Henrik Bengtsson > >>> >>>>>> on Thu, 27 Jun 2019 16:00:39 -0700 writes: > >>> > > >>> >> Using: > >>> >> > >>> >> untrace(methods::conformMethod) > >>> >> at <- c(12,4,3,2) > >>> >> str(body(methods::conformMethod)[[at]]) > >>> >> ## language omittedSig <- omittedSig && (signature[omittedSig] != > "missing") > >>> >> cc <- 0L > >>> >> trace(methods::conformMethod, tracer = quote({ > >>> >> cc <<- cc + 1L > >>> >> print(cc) > >>> >> if (cc == 31) { ## manually identified > >>> >> untrace(methods::conformMethod) > >>> >> trace(methods::conformMethod, at = list(at), tracer = quote({ > >>> >> str(list(signature = signature, mnames = mnames, fnames = > fnames)) > >>> >> print(ls()) > >>> >> try(str(list(omittedSig = omittedSig, signature = signature))) > >>> >> })) > >>> >> } > >>> >> })) > >>> >> loadNamespace("oligo") > >>> >> > >>> >> gives: > >>> >> > >>> >> Untracing function "conformMethod" in package "methods" > >>> >> Tracing function "conformMethod" in package "methods" > >>> >> Tracing conformMethod(signature, mnames, fnames, f, fdef, > definition) > >>> >> step 12,4,3,2 > >>> >> List of 3 > >>> >> $ signature: Named chr [1:4] "TilingFeatureSet" "ANY" "ANY" "array" > >>> >> ..- attr(*, "names")= chr [1:4] "object" "subset" "target" "value" > >>> >> ..- attr(*, "package")= chr [1:4] "oligoClasses" "methods" > "methods" "methods" > >>> >> $ mnames : chr [1:2] "object" "value" > >>> >> $ fnames : chr [1:4] "object" "subset" "target" "value" > >>> >> [1] "f" "fdef" "fnames" "fsig" "imf" > >>> >> [6] "method" "mnames" "omitted" "omittedSig" "sig0" > >>> >> [11] "sigNames" "signature" > >>> >> List of 2 > >>> >> $ omittedSig: logi [1:4] FALSE TRUE TRUE FALSE > >>> >> $ signature : Named chr [1:4] "TilingFeatureSet" "ANY" "ANY" > "array" > >>> >> ..- attr(*, "names")= chr [1:4] "object" "subset" "target" "value" > >>> >> ..- attr(*, "package")= chr [1:4] "oligoClasses" "methods" > "methods" "methods" > >>> >> Error in omittedSig && (signature[omittedSig] != "missing") : > >>> >> 'length(x) = 4 > 1' in coercion to 'logical(1)' > >>> >> Error: unable to load R code in package 'oligo' > >>> >> > >>> > > >>> > Thank you, Henrik, nice piece of using trace() .. and the above > >>> > is useful for solving the issue -- I can work with that. > >>> > > >>> > I'm already pretty sure the wrong code starts with > >>> > > >>> > omittedSig <- sigNames %in% fnames[omitted] # .... > > >> my "pretty sure" statement above has proven to be wrong .. > > >>> > ------------- > >>> > > >>> > >>> I think the intention must have been that the two "ANY" signatures > should change to "missing". > > >> Definitely. > > >>> However, with the current logic that will not happen, because > >>> > >>> > c(F,T,T,F) && c(T,T) > >>> [1] FALSE > >>> > >>> Henrik's non-fix would have resulted in > >>> > >>> > c(F,T,T,F) & c(T,T) > >>> [1] FALSE TRUE TRUE FALSE > >>> > >>> which is actually right, but only coincidentally due to recycling of > c(T,T). Had it been c(F,T) then it would have been expanded to c(F,T,F,T) > which would be the opposite of what was wanted. > >>> > >>> Barring NA issues, I still think > >>> > >>> omittedSig[omittedSig] <- (signature[omittedSig] != "missing") > >>> > >>> should do the trick. > > >> yes, (most probably). I've found a version of that which should > >> be even easier to "read and understand", in svn commit 76753 : > > >> svn diff -c 76753 src/library/methods/R/RMethodUtils.R > > >> --- src/library/methods/R/RMethodUtils.R (Revision 76752) > >> +++ src/library/methods/R/RMethodUtils.R (Revision 76753) > >> @@ -342,8 +342,7 @@ > >> gettextf("formal arguments (%s) omitted in the method definition > cannot be in the signature", bad2), > >> call. = TRUE, domain = NA) > >> } > >> - else if(!all(signature[omittedSig] == "missing")) { > >> - omittedSig <- omittedSig && (signature[omittedSig] != > "missing") > >> + else if(any(omittedSig <- omittedSig & signature != "missing")) { > > > >> BTW: I've marked this --- and the runmed() seg.fault + na.action > >> change --- as something to be added to R 3.6.1 patched, as I > >> deemed I should obey the "code freeze" rule in both cases. > > >> Martin > > > Hmm... I think we got a 'Neverending Story' here -- because it > > seems, both Peter and I were wrong in thinking that it's a good > > idea to change "missing" to "ANY" here ... > > ((or if that *was* correct, that needs to entail more changes > > happening during setMethod(.) {conformMethod() is only called in > > one place in our code base, namely from setMethod()} : > > as a matter of fact, I've been brave for now, left the change to > conformMethod() and started to fix the constructed .local() > calls which are created in conformMethod()'s sibling, > which is rematchDefinition(). > > It seems that this builds e.g. Matrix {with its gazillion > setMethod()s} and that continues to run its own tests. OTOH, > Matrix may not trigger the situations that are dealt with here > at all, as the signature() are rarely longer than three, and at > some point in time I had made long passes through the package in > order to "minimize" the .local() calls. > > --> svn commit 76756 (in addition to 76753, mentioned earlier) > now has rematchDefinition() changes > > I would be positively surprised if (but can imagine that) this > had no affect on CRAN / Bioconductor packages. > > Still, these two changes seem to achieve what both the comments > and the documentation of conformMethod() and rematchDefinition() > suggest should happen. > > Of course, I'd really be happy if people with S4 packages would > check them with an R-devel version with svn rev >= 76756 > and report problems they see. > I do imagine effects, and would expect that bugs in current code > become visible where they had not done so previously. > > Martin > > > I've started to explore the effects of the change using and > > extending the tests/reg-tests-1d.R example that I had just committed. > > > And the result is *not good* : > > > As we said above, the new code does replace all "ANY" by "missing" in > the > > signature, unless the "ANY" are at the end of the signature. > > > However, later methods package code producing the .local(.) > > calls in the method definition (in cases where the signature of > > the generic and the method do not match exactly) --- possibly > > may have been tweaked later than the conformMethod() code --- > > and the .local() calls they now produce > > > - work as intended for R <= 3.6.0 (and R 3.6.1 RC) > > - fail to work for R-devel with the change : > > > See this (not a minimal rep.rex. but one building on Henrik's > > oligo case and what's newly in tests/reg-tests-1d.R ) : > > > > ----------------------------------------------------------------------------- > > > ## conformMethod() "&& logic" bug, by Henrik Bengtsson on R-devel > list, 2019-06-22 > > setClass("tilingFSet", slots = c(x = "numeric")) > > if(!is.null(getGeneric("oligoFn"))) removeGeneric("oligoFn") > > setGeneric("oligoFn", > > function(object, subset, target, value) { standardGeneric("oligoFn") }) > > Sys.unsetenv("_R_CHECK_LENGTH_1_LOGIC2_") ## << added here, to compare > with R 3.6.0, 3.5.3, .. > > setMethod("oligoFn", signature(object = "tilingFSet", value="array"), > ## Method _ 1 _ > > function(object, value) { list(object=object, value=value) }) > > setMethod("oligoFn", signature(object = "matrix", target="array"), > ## Method _ 2 _ > > function(object, target) list(object=object, target=target)) > > setMethod("oligoFn", signature(object = "matrix", subset="integer"), > ## Method _ 3 _ > > function(object, subset) list(object=object, subset=subset)) # > (*no* Note: ANY at end) > > setMethod("oligoFn", signature(object = "matrix"), > ## Method _ 4 _ > > function(object) list(object=object)) # > (*no* Note: ANY at end) > > showMethods("oligoFn") # F.Y.I.: in R 3.6.0 and earlier: contains > "ANY" everywhere > > > ##-- Now, the following *DOES* work fine in R <= 3.6.0 but *no longer* > in R-devel : > > str(r1 <- oligoFn(object=new("tilingFSet"), value=array(2))) > > str(r2 <- oligoFn(object=diag(2), target=array(42))) > > ## These 2 work fine in all versions of R: Here the "ANY" remain at the > end: > > str(r3 <- oligoFn(object=diag(2), subset=1:3)) > > str(r4 <- oligoFn(object=diag(2))) > > > > ----------------------------------------------------------------------------- > > The two errors in R-devel are actually quite user-confusing: > > >> r2 <- oligoFn(object=diag(2), target=array(42)) > > Error in .local(object, target) : > > argument "target" is missing, with no default > >> getMethod("oligoFn", signature(object="matrix", subset="missing", > target="array")) > > Method Definition: > > > function (object, subset, target, value) > > { > > .local <- function (object, subset, target, value) > > list(object = object, target = target) > > .local(object, target) > > } > > > Signatures: > > object subset target value > > target "matrix" "missing" "array" "ANY" > > defined "matrix" "missing" "array" "ANY" > >> > > > > My conclusion: There's something really wrong with what > > conformMethod() has been *intended* to achieve and what it > > "accidentally" did achieve in these cases: it never replaced > > "ANY" by "missing" in all these cases *AND* that is what it > > seems it should continue doing. > > > BTW: ?conformMethod goes to a page with quite a few things, > > relevantly containing > > > ‘conformMethod’: If the formal arguments, ‘mnames’, are not > > identical to the formal arguments to the function, ‘fnames’, > > ‘conformMethod’ determines whether the signature and the two > > sets of arguments conform, and returns the signature, > > possibly extended. The function name, ‘f’ is supplied for > > error messages. The generic function, ‘fdef’, supplies the > > generic signature for matching purposes. > > > The method assignment conforms if method and generic function > > have identical formal argument lists. It can also conform if > > the method omits some of the formal arguments of the function > > but: (1) the non-omitted arguments are a subset of the > > function arguments, appearing in the same order; (2) there > > are no arguments to the method that are not arguments to the > > function; and (3) the omitted formal arguments do not appear > > as explicit classes in the signature. A future extension > > hopes to test also that the omitted arguments are not assumed > > by being used as locally assigned names or function names in > > the body of the method. > > > --- > > It seems my commit to R-devel needs another change. > > This has to wait for hours currently, though. > > > Martin > > > ______________________________________________ > > R-devel@r-project.org mailing list > > https://stat.ethz.ch/mailman/listinfo/r-devel > > ______________________________________________ > R-devel@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel