>>>>> 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


> > *Still*  I cannot understand why in my case (and probably Peter,
> > as he also said he can't reproduce),
> > the  conformMethod() function is not even called  when I run
> >     loadNamespace("oligo").
> > 
> > As conformMethod() is *only* called from setMethod(), I've
> > started trace()ing  setMethod() and indeed, it is *only* called one,
> > and not with oligo methods/generics,... 
> > 
> > Henrik, do you per chance not install packages in the usual way,
> > i.e., do you install them without saving all the pre-computed
> > classes and methods tables etc,
> > and that would be *why* these setMethod() etc are only called at
> > this point in time ?
> > 
> > Martin
> 
> -- 
> Peter Dalgaard, Professor,
> Center for Statistics, Copenhagen Business School
> Solbjerg Plads 3, 2000 Frederiksberg, Denmark
> Phone: (+45)38153501
> Office: A 4.23
> Email: pd....@cbs.dk  Priv: pda...@gmail.com
> 
> 
> 
> 
>

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to