[Bioc-devel] Question about sumbition process and biocviews

Martin Morgan martin.morgan at roswellpark.org
Sun Nov 6 23:59:09 CET 2016


On 11/06/2016 04:54 PM, Ioannis Vardaxis wrote:
> Thanks for the answer,
>
> I have some other questions about BiocCheck.
>
> First I get the following warning:
> * This is a software package, checking vignette directories...
>     * ERROR: 'vignettes' directory!
>
>
> I have my vignettes directory in the inst/doc/vignettes. If I change the
> directory and place the vignettes in the top directory I don¹t get an
> error from biocCheck, but I get a fatal error from Rcheck.

The vignettes directory should be in the top-level directory 
YourPacakge/vignettes/ and not in YourPackage/inst/doc. If you get a 
fatal error, then there is something about your vignette (or indirectly 
in your package code) that is very incorrect. You should be able to 
'tangle' your vignette to get the pure R code, and then to run it, e.g., 
I can

     $ cd Rsamtools/vignettes
     $ R CMD Stangle Rsamtools-Overview.Rnw
     Output file:  Rsamtools-Overview.R
     $ R -f Rsamtools-Overview.R

>
> Secondly:
> Checking unit tests...
>     * NOTE: Consider adding unit tests. We strongly encourage them. See
>       http://bioconductor.org/developers/how-to/unitTesting-guidelines/.
>
>
> I read about unit tests, however the package is done and it works fine,
> and at the same time I don¹t see how unit tests would benefit me based on
> the functions in my package. Are them necessary?

They are strongly encouraged but not required. Many would argue that 
they are necessary to ensure that your package behaves as expected, and 
continues to do so as underlying dependencies change. Here's a silly 
function

     f = function(n) {
         x = integer(n)
         for (i in 1:n)
             x[i] = i
         x
     }

and a unit test that reveals an error.

     test_that("f works as expected for common cases", {
         expect_equal(f(2), c(1L, 2L))
         expect_equal(f(1), 1L)
         expect_equal(f(0), integer(0))
         expect_error(f("two"))
     })

Which leads to

Error: Test failed: 'f works as expected for common cases'
* f(0) not equal to integer(0).
Lengths differ: 1 vs 0

The fix in this case might be

     f = function(n) {
         seq_len(n)
     }

though now its clear that my four lines of code were not necessary at all.

Interestingly, in writing that example I made a mistake in my original 
f(), writing x[i] = n rather than my intended x[i] = i. The first 
expectation failed, helping to show me what I was doing wrong. I also 
wrote the last expectation as f("2"), which a little surprisingly also 
failed (to create an error) -- R coerced 1:"2" to 1:2; maybe I'd want to 
think about whether this behavior would be appropriate in my actual 
code, and if not write some checks on the inputs. It's surprising how 
easy bugs creep into code, and how unit tests help to see those bugs. See

   http://bioconductor.org/developers/how-to/unitTesting-guidelines/

for some further motivation.

>
> Thirdly, I used the Rdpack for adding references to the roxynen files, but
> I get an error from biocCheck that the macro is unknown. Is there another
> way of using references in roxygen?

this isn't formulated in a clear enough way (e.g., with a short example 
and with the exact error message) to be able to provide an answer.

>
> Finally, a question about coding: My longest function is 326 lines long,
> and cannot be smaller, is that ok? I get a note in biocCheck. Moreover I
> get the following note:
> * Checking formatting of DESCRIPTION, NAMESPACE, man pages, R source,
>   and vignette source...
>     * NOTE: Consider shorter lines; 4 lines (0%) are > 80 characters
>       long.
>     * NOTE: Consider indenting lines with a multiple of 4 spaces; 462
>       lines (6%) are not.
>
>
> None of my code cross the 80 character line though and the spaces are
> using the double tab that you need.

These are style recommendations and generally 'at your discretion'. Of 
course your 326 line function can be smaller -- identify the logical 
steps of your computation ('check inputs', 'initialize', 'iterate to 
convergence', 'validate result', 'format result for user') and implement 
each as a (non-exported) function called by the the function exposed to 
the user. This way you can think carefully about the logic of each 
function, write extensive unit tests that validate the inputs and 
expected outputs of the function, and hopefully re-use code in several 
different places.

The second NOTE above suggests indentation with spaces rather than tabs 
(4 spaces per tab) simply because tab width (and hence visual 
indentation) is at the discretion of the editor in use.

Martin

>
>
> Best,
>


This email message may contain legally privileged and/or...{{dropped:2}}



More information about the Bioc-devel mailing list