[Bioc-devel] condition tests on vectors with length greater than 1

Hervé Pagès hpages at fredhutch.org
Thu Mar 30 04:19:32 CEST 2017


Hi Martin,

On 03/29/2017 02:37 PM, Martin Morgan wrote:
> Bioc developers,
>
> R emits a warning when a condition test has length > 1
>
> $ R --vanilla
>> if (letters == "a") TRUE
> [1] TRUE
> Warning message:
> In if (letters == "a") TRUE :
>   the condition has length > 1 and only the first element will be used
>
> These are almost always programming errors.
>
> R-3-4-branch and R-devel can be configured to report such errors, as
> described on the help page for, e.g., `?"if"`
>
> $ _R_CHECK_LENGTH_1_CONDITION_=TRUE R --vanilla
>> if (letters=="a") TRUE
> Error in if (letters == "a") TRUE : the condition has length > 1
>
> The attached file (thanks to Tomas Kalibera) summarizes Bioconductor
> code that triggers this type of error.
>
> If you maintain one of these packages (appearing in either column),
> please address the error. And of course as a developer, please avoid
> making the error in the future!

I promess I won't do it again ;-)

Thanks for fixing the condition test in GenomicFeatures!

H.

>
>> r = read.csv("long-conditional-bioc.csv")
>> r[, c("FailedPackage", "Srcref")]
>    FailedPackage                                          Srcref
> 1     biovizBase               biovizBase/R/crunch-method.R#295
> 2  branchpointer               branchpointer/R/makeRegions.R#41
> 3       Cardinal                        Cardinal/R/spatial.R#57
> 4      debrowser                       debrowser/R/heatmap.R#38
> 5        DMRcate                        DMRcate/R/DMR.plot.R#13
> 6      exomePeak                          exomePeak/R/RMT.R#119
> 7          fabia                           fabia/R/fabia.R#1504
> 8   GenomeInfoDb             GenomicFeatures/R/TxDb-class.R#377
> 9         Glimma                           Glimma/R/hexcol.R#32
> 10     GOexpress                 VennDiagram/R/adjust.venn.R#42
> 11      GUIDEseq GUIDEseq/R/offTargetAnalysisOfPeakRegions.R#95
> 12      hapFabia  hapFabia/R/methods-IBDsegmentList-class.R#110
> 13     MassArray                   MassArray/R/convControl.R#26
> 14    methylPipe                methylPipe/R/Allfunctions.R#635
> 15        NOISeq               NOISeq/R/biodetection.plot.R#157
> 16      pathview                  pathview/R/geneannot.map.R#31
> 17      phyloseq              phyloseq/R/multtest-wrapper.R#101
> 18         rHVDM              rHVDM/R/measurementerrorHVDM.R#23
> 19          SEPA                  SEPA/R/truetimevisualize.R#28
> 20      SPLINTER                 SPLINTER/R/main_splinter.R#817
>
> As an example the GenomeInfoDb package (row 8) has this complete record
>
> FailedPackage "GenomeInfoDb"
> IfPackage     "GenomicFeatures"
> File          "GenomeInfoDb.Rcheck/GenomeInfoDb-Ex.Rout"
> Function      "S4 Method seqlevels<-:GenomeInfoDb defined in namespace
>                GenomicFeatures with signature TxDb has this body."
> Srcref        "GenomicFeatures/R/TxDb-class.R#377 "
>
> The problem was from
>
>   GenomicFeatures/R/TxDb-class.R#377
>
> which has
>
>     mode <- GenomeInfoDb:::getSeqlevelsReplacementMode(value, x_seqlevels0)
>     if (mode == -2L) {
>
> I looked at
>
>> GenomeInfoDb:::getSeqlevelsReplacementMode
> function (new_seqlevels, old_seqlevels)
> {
>     ...
>
> and saw that its code returns a vector with length > 1 intentionally
> under some specific circumstances. Also, all other uses of the return
> value of this function (in the GenomeInfoDb and GenomicFeatures package)
> test for identity of the return value via `identical()`, which is always
> a scalar. This suggests the fix
>
> GenomicFeatures$ svn diff R/TxDb-class.R
> Index: R/TxDb-class.R
> ===================================================================
> --- R/TxDb-class.R    (revision 127829)
> +++ R/TxDb-class.R    (working copy)
> @@ -374,7 +374,7 @@
>      ## detect the situation where the user intention is to subset the
> "real"
>      ## seqlevels.
>      mode <- GenomeInfoDb:::getSeqlevelsReplacementMode(value,
> x_seqlevels0)
> -    if (mode == -2L) {
> +    if (identical(mode, -2L)) {
>          ## "subsetting of the real seqlevels" mode
>          x$user_seqlevels <- value
>          x$user2seqlevels0 <- match(value, x_seqlevels0)
>
> I did do some more digging around.
>
> From the report, the failure was detected while running the example page
> script generated while checking GenomeInfoDb.
>
>   GenomeInfoDb.Rcheck/GenomeInfoDb-Ex.Rout
>
> So I generated this
>
>   R CMD build --no-build-vignettes GenomeInfoDb
>   R CMD check GenomeInfoDb_1.27.11.tar.gz
>
> and processed it to find the error
>
>   _R_CHECK_LENGTH_1_CONDITION_=TRUE R -f
> GenomeInfoDb.Rcheck/GenomeInfoDb-Ex.R
>
> It failed while running the example on the help page with name
> "seqlevels-wrapper"
>
>> ### Name: seqlevels-wrappers
>> ### Title: Convenience wrappers to the seqlevels() getter and setter
>> ### Aliases: seqlevels-wrappers keepSeqlevels dropSeqlevels
> renameSeqlevels
>> ###   restoreSeqlevels standardChromosomes keepStandardChromosomes
>> ### Keywords: methods utilities
>>
>> ### ** Examples
>>
> ...
>> renameSeqlevels(txdb, sub("chr", "CH", seqlevels(txdb)))
> Error in if (mode == -2L) { : the condition has length > 1
> Calls: renameSeqlevels -> seqlevels<- -> seqlevels<-
> Execution halted
>
> I then could get a relatively simple reproducible example in R with
>
> $ _R_CHECK_LENGTH_1_CONDITION_=TRUE R --vanilla
>> suppressPackageStartupMessages(library(GenomeInfoDb))
>> example("seqlevels-wrappers")
>
> After installing the updated GenomicFeatures package, the error did not
> occur. Likewise, running GenomeInfoDb-Ex.R did not generate any errors.
>
> Martin
>
>
> This email message may contain legally privileged and/or confidential
> information.  If you are not the intended recipient(s), or the employee
> or agent responsible for the delivery of this message to the intended
> recipient(s), you are hereby notified that any disclosure, copying,
> distribution, or use of this email message is prohibited.  If you have
> received this message in error, please notify the sender immediately by
> e-mail and delete this email message from your computer. Thank you.
> _______________________________________________
> Bioc-devel at r-project.org mailing list
> https://urldefense.proofpoint.com/v2/url?u=https-3A__stat.ethz.ch_mailman_listinfo_bioc-2Ddevel&d=DwICAg&c=eRAMFD45gAfqt84VtBcfhQ&r=BK7q3XeAvimeWdGbWY_wJYbW0WYiZvSXAJJKaaPhzWA&m=RZzoWcMLUW_D96-oXJ1AMgVIohSuF9eeLh4WSmEmjFg&s=2xVPo2OzTo1DpMueTH6ICx5doNmuJ8O7iwJC4ZVGTE0&e=
>

-- 
Hervé Pagès

Program in Computational Biology
Division of Public Health Sciences
Fred Hutchinson Cancer Research Center
1100 Fairview Ave. N, M1-B514
P.O. Box 19024
Seattle, WA 98109-1024

E-mail: hpages at fredhutch.org
Phone:  (206) 667-5791
Fax:    (206) 667-1319



More information about the Bioc-devel mailing list