Henrik Bengtsson
2019-Jun-27 23:00 UTC
[Rd] methods package: A _R_CHECK_LENGTH_1_LOGIC2_=true error
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'
This is with:
sessionInfo()
R version 3.6.0 Patched (2019-06-23 r76734)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 18.04.2 LTS
Matrix products: default
BLAS: /home/hb/software/R-devel/R-3-6-branch/lib/R/lib/libRblas.so
LAPACK: /home/hb/software/R-devel/R-3-6-branch/lib/R/lib/libRlapack.so
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
[3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=en_US.UTF-8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
loaded via a namespace (and not attached):
[1] Rcpp_1.0.1 affxparser_1.56.0
[3] XVector_0.24.0 splines_3.6.0
[5] GenomicRanges_1.36.0 BiocGenerics_0.30.0
[7] zlibbioc_1.30.0 IRanges_2.18.1
[9] bit_1.1-14 BiocParallel_1.18.0
[11] lattice_0.20-38 foreach_1.4.4
[13] blob_1.1.1 GenomeInfoDb_1.20.0
[15] tools_3.6.0 SummarizedExperiment_1.14.0
[17] parallel_3.6.0 grid_3.6.0
[19] Biobase_2.44.0 ff_2.2-14
[21] DBI_1.0.0 iterators_1.0.10
[23] oligoClasses_1.46.0 matrixStats_0.54.0
[25] digest_0.6.19 bit64_0.9-7
[27] preprocessCore_1.46.0 affyio_1.54.0
[29] Matrix_1.2-17 GenomeInfoDbData_1.2.1
[31] BiocManager_1.30.4 codetools_0.2-16
[33] S4Vectors_0.22.0 bitops_1.0-6
[35] RCurl_1.95-4.12 memoise_1.1.0
[37] RSQLite_2.1.1 DelayedArray_0.10.0
[39] compiler_3.6.0 Biostrings_2.52.0
[41] stats4_3.6.0
/Henrik
On Thu, Jun 27, 2019 at 8:16 AM Martin Maechler
<maechler at stat.math.ethz.ch> wrote:>
> >>>>> peter dalgaard
> >>>>> on Thu, 27 Jun 2019 16:23:14 +0200 writes:
>
> > Henrik,
> > If a minimal reprex is hard to construct, could you perhaps
instrument your version of R to include a browser() call at the start of the
>
> > else if(!all(signature[omittedSig] == "missing")) {
>
> > branch, run the code that triggers the issue for you (and must hit
that branch) and tell us what the "signature" and
"omittedSig" objects look like at that point?
>
> > Bonus points for figuring out why it is needed to use numerical
indexing in
>
> > omittedSig <- seq_along(omittedSig)[omittedSig]
> > signature[omittedSig] <- "missing" # logical index
will extend signature!
>
> > (I'm sure there is a valid reason, I just don't get it...)
>
> > -pd
>
> I've also have mused over that question...
> and I had assumed some difference in the case the original
> omittedSig contains NAs ... but that's NOT true actually, see:
>
> > sign2 <- signatures <- LETTERS
> > omittedSig <- LETTERS < "K"
> > omittedSig[c(8,18)] <- NA # now have an omittedSig with {T, F,
NA}
> > iSig <- seq_along(omittedSig)[omittedSig]
> > sign2[iSig] <- "missing"
> > signatures[omittedSig] <- "missing"
> > identical(sign2, signatures)
> [1] TRUE
> >
>
> so I still don't see the case where it makes a difference.
>
> Martin
>
> >> On 25 Jun 2019, at 09:44 , peter dalgaard <pdalgd at
gmail.com> wrote:
> >>
> >> Argh! Yes you are right, the "fix" doesn't. And
I fell into the same "hey it's a vector so && has to be
wrong"-trap. So this has to be reverted to something that has at least
failed unconspicuously for a decade.... Will do. Thanks to Martin for remaining
suspicious!
> >>
> >> [This code was originally from 2009, by John Chambers. It is
not too likely that he'll remember what the intention actually was... The
logic does escape me: An omitted signature is only an omitted signature if the
signature of the omitted signature is not "missing"? In that case, I
think
> >>
> >> omittedSig[omittedSig] <- (signature[omittedSig] !=
"missing")
> >>
> >> might work (omittedSig[omittedSig] == TRUE, so we don't
need to &. That is, unless there are NA issues.), but I am not at all sure
that is what is wanted!
> >> ]
> >>
> >> -pd
> >>
> >>> On 25 Jun 2019, at 07:16 , Henrik Bengtsson
<henrik.bengtsson at gmail.com> wrote:
> >>>
> >>> **Maybe this bug needs to be understood further before
applying the
> >>> patch because patch is most likely also wrong**
> >>>
> >>> Because, from just looking at the expressions, I think
neither the R
> >>> 3.6.0 version:
> >>>
> >>> omittedSig <- omittedSig &&
(signature[omittedSig] != "missing")
> >>>
> >>> nor the patched version (I proposed):
> >>>
> >>> omittedSig <- omittedSig & (signature[omittedSig]
!= "missing")
> >>>
> >>> can be correct. For a starter, 'omittedSig' is a
logical vector. We
> >>> see that 'omittedSig' is used to subset
'signature'. In other words,
> >>> the length of 'signature[omittedSig]' and hence
the length of
> >>> '(signature[omittedSig] != "missing")'
will equal sum(omittedSig),
> >>> i.e. the length will be in {0,1,...,length(omittedSig)}.
> >>>
> >>> The R 3.6.0 version with '&&' is not
correct because '&&' requires
> >>> length(omittedSig) == 1L and sum(omittedSig) == 1L, which
is unlikely
> >>> to be the original intention.
> >>>
> >>> The patched version with '&' is most likely
not correct either because
> >>> 'LHS & RHS' assume length(LHS) == length(RHS),
unless it relies on the
> >>> auto-expansion of either vector. So, for the
'&' version to be
> >>> correct, it basically requires that length(omittedSig) =
length(LHS) > >>> length(RHS) = sum(omittedSig), which also
sounds unlikely to be the
> >>> original intention.
> >>>
> >>> Disclaimer: Please note that I have not at all studied the
rest of the
> >>> function, so the above is just based on that single line
plus
> >>> debugging that 'omittedSig' is a logical vector.
> >>>
> >>> Martin, I don't have the time to dive into this
further. Though I did
> >>> try to see if it happened when one of oligo's
dependencies were
> >>> loaded, but that was not the case. It kicks in when oligo
is loaded.
> >>> FYI, I can also replicate your non-replicatation on
another R 3.6.0
> >>> version. I'll see if I can narrow down what's
different, e.g.
> >>> comparing sessionInfo():s, etc. However, I want to reply
with
> >>> findings above asap due to the R 3.6.1 release and you
might roll back
> >>> the patch (since it might introduce other bugs as Peter
mentioned).
> >>>
> >>> /Henrik
> >>>
> >>>
> >>> On Mon, Jun 24, 2019 at 3:05 AM Martin Maechler
> >>> <maechler at stat.math.ethz.ch> wrote:
> >>>>
> >>>>>>>>> Henrik Bengtsson via R-core
> >>>>>>>>> on Sun, 23 Jun 2019 11:29:58 -0700
writes:
> >>>>
> >>>>> Thank you.
> >>>>> To correct myself, I can indeed reproduce this
with R --vanilla too.
> >>>>> A reproducible example is:
> >>>>
> >>>>> $ R --vanilla
> >>>>> R version 3.6.0 Patched (2019-05-31 r76629) --
"Planting of a Tree"
> >>>>> ...
> >>>>> Sys.setenv("_R_CHECK_LENGTH_1_LOGIC2_" =
"true")
> >>>>> loadNamespace("oligo")
> >>>>> Error in omittedSig &&
(signature[omittedSig] != "missing") :
> >>>>> 'length(x) = 4 > 1' in coercion to
'logical(1)'
> >>>>> Error: unable to load R code in package ?oligo?
> >>>>
> >>>>> /Henrik
> >>>>
> >>>> Thank you Henrik, for the report, etc, but
> >>>> hmm... after loading the oligo package, almost 40 (non
> >>>> base+Recommended) packages have been loaded as well,
which hence
> >>>> need to have been installed before, too ..
> >>>> which is not quite a "vanilla repr.ex." in
my view
> >>>>
> >>>> Worse, I cannot reproduce :
> >>>>
> >>>>> Sys.setenv("_R_CHECK_LENGTH_1_LOGIC2_" =
"true")
> >>>>> Sys.getenv("_R_CHECK_LENGTH_1_LOGIC2_")
> >>>> [1] "true"
> >>>>> debugonce(conformMethod)
> >>>>> loadNamespace("oligo")
> >>>> <environment: namespace:oligo>
> >>>> Warning messages:
> >>>> 1: multiple methods tables found for ?rowSums?
> >>>> 2: multiple methods tables found for ?colSums?
> >>>> 3: multiple methods tables found for ?rowMeans?
> >>>> 4: multiple methods tables found for ?colMeans?
> >>>>> sessionInfo()
> >>>> R Under development (unstable) (2019-06-20 r76729)
> >>>>
> >>>> (similarly with other versions of R >= 3.6.0).
> >>>>
> >>>> So, even though R core has fixed this now in the
sources, it
> >>>> would be nice to have an "as simple as
possible" repr.ex. for this.
> >>>>
> >>>> Martin
> >>>>
> >>>>
> >>>>
> >>>>> On Sun, Jun 23, 2019 at 1:54 AM peter dalgaard
<pdalgd at gmail.com> wrote:
> >>>>>
> >>>>> This looks obvious enough, so I just committed your
fix to R-devel and R-patched.
> >>>>>
> >>>>> I'm at the wrong machine for thorough testing, but
at least it seems to build OK. However, I sense some risk that this could
uncover sleeping bugs elsewhere, so watch out.
> >>>>>
> >>>>> -pd
> >>>>>
> >>>>>>> On 22 Jun 2019, at 18:49 , Henrik
Bengtsson <henrik.bengtsson at gmail.com> wrote:
> >>>>>>>
> >>>>>>> DISCLAIMER: I can not get this error with
R --vanilla, so it only
> >>>>>>> occurs when some other package is also
loaded. I don't have time to
> >>>>>>> find to narrow that down for a
reproducible example, but I believe the
> >>>>>>> following error in R 3.6.0:
> >>>>>>>
> >>>>>>>>
Sys.setenv("_R_CHECK_LENGTH_1_LOGIC2_" = "true")
> >>>>>>>> library(oligo)
> >>>>>>> Error in omittedSig &&
(signature[omittedSig] != "missing") :
> >>>>>>> 'length(x) = 4 > 1' in coercion
to 'logical(1)'
> >>>>>>> Error: unable to load R code in package
'oligo'
> >>>>>>>
> >>>>>>> is because of a
'_R_CHECK_LENGTH_1_LOGIC2_=true' mistake in the
> >>>>>>> 'methods' package. Here's the
patch:
> >>>>>>>
> >>>>>>> $ svn diff
src/library/methods/R/RMethodUtils.R &
> >>>>>>> [1] 1062
> >>>>>>> Index:
src/library/methods/R/RMethodUtils.R
> >>>>>>>
==================================================================>
>>>>>>> --- src/library/methods/R/RMethodUtils.R (revision
76731)
> >>>>>>> +++ src/library/methods/R/RMethodUtils.R
(working copy)
> >>>>>>> @@ -343,7 +343,7 @@
> >>>>>>> call. = TRUE, domain = NA)
> >>>>>>> }
> >>>>>>> else if(!all(signature[omittedSig] ==
"missing")) {
> >>>>>>> - omittedSig <- omittedSig
&& (signature[omittedSig] != "missing")
> >>>>>>> + omittedSig <- omittedSig &
(signature[omittedSig] != "missing")
> >>>>>>> .message("Note: ",
.renderSignature(f, sig0),
> >>>>>>> gettextf("expanding the signature to
include omitted
> >>>>>>> arguments in definition: %s",
> >>>>>>> paste(sigNames[omittedSig], ">
>>>>>>> \"missing\"",collapse = ",
")))
> >>>>>>> [1]+ Done svn diff
src/library/methods/R/RMethodUtils.R
> >>>>>>>
> >>>>>>> Maybe still in time for R 3.6.1?
> >>>>>>>
> >>>>>>> /Henrik
> >>>>>>>
> >>>>>>>
______________________________________________
> >>>>>>> R-devel at r-project.org mailing list
> >>>>>>>
https://stat.ethz.ch/mailman/listinfo/r-devel
> >>>>>
> >>>>> --
> >>>>> Peter Dalgaard, Professor,
> >>>>> Center for Statistics, Copenhagen Business School
> >>>>> Solbjerg Plads 3, 2000 Frederiksberg, Denmark
> >>>>> Phone: (+45)38153501
> >>>>> Office: A 4.23
> >>>>> Email: pd.mes at cbs.dk Priv: PDalgd at gmail.com
> >>>>
> >>>> ______________________________________________
> >>>> R-devel at r-project.org mailing list
> >>>> https://stat.ethz.ch/mailman/listinfo/r-devel
> >>>
> >>> ______________________________________________
> >>> R-devel at r-project.org mailing list
> >>> https://stat.ethz.ch/mailman/listinfo/r-devel
> >>
> >> --
> >> Peter Dalgaard, Professor,
> >> Center for Statistics, Copenhagen Business School
> >> Solbjerg Plads 3, 2000 Frederiksberg, Denmark
> >> Phone: (+45)38153501
> >> Office: A 4.23
> >> Email: pd.mes at cbs.dk Priv: PDalgd at gmail.com
> >>
> >>
> >>
> >>
> >>
> >>
> >>
> >>
> >>
>
> > --
> > Peter Dalgaard, Professor,
> > Center for Statistics, Copenhagen Business School
> > Solbjerg Plads 3, 2000 Frederiksberg, Denmark
> > Phone: (+45)38153501
> > Office: A 4.23
> > Email: pd.mes at cbs.dk Priv: PDalgd at gmail.com
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
Martin Maechler
2019-Jun-28 14:03 UTC
[Rd] methods package: A _R_CHECK_LENGTH_1_LOGIC2_=true error
>>>>> 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] # .... ------------- *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
2019-Jun-28 14:20 UTC
[Rd] methods package: A _R_CHECK_LENGTH_1_LOGIC2_=true error
> On 28 Jun 2019, at 16:03 , Martin Maechler <maechler at 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] # .... > > ------------- >I think the intention must have been that the two "ANY" signatures should change to "missing". 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. -pd> > *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.mes at cbs.dk Priv: PDalgd at gmail.com
Possibly Parallel Threads
- methods package: A _R_CHECK_LENGTH_1_LOGIC2_=true error
- methods package: A _R_CHECK_LENGTH_1_LOGIC2_=true
- methods package: A _R_CHECK_LENGTH_1_LOGIC2_=true error
- methods package: A _R_CHECK_LENGTH_1_LOGIC2_=true error
- methods package: A _R_CHECK_LENGTH_1_LOGIC2_=true error