On 27/06/2016 9:22 AM, Lenth, Russell V wrote:
My package 'lsmeans' is now suddenly broken because of a new provision in the 'tibble' package 
(loaded by 'dplyr' 0.5.0), whereby the "[[" and "$" methods for 'tbl_df' 
objects - as documented - throw an error if a variable is not found.

The problem is that my code uses tests like this:

        if (is.null (x$var)) {...}

to see whether 'x' has a variable 'var'. Obviously, I can work around this using

        if (!("var" %in% names(x))) {...}

but (a) I like the first version better, in terms of the code being 
understandable; and (b) isn't there a long history whereby we can expect a NULL 
result when accessing an absent member of a list (and hence a data.frame)? (c) 
the code base for 'lsmeans' has about 50 instances of such tests.

Anyway, I wonder if a lot of other package developers test for absent variables 
in that first way; if so, they too are in for a rude awakening if their users 
provide a tbl_df instead of a data.frame. And what is considered the best 
practice for testing absence of a list member? Apparently, not either of the 
above; and because of (c), I want to do these many tedious corrections only 
once.

Thanks for any light you can shed.

This is why CRAN asks that people test reverse dependencies.

I think the most defensive thing you can do is to write a small function

name_missing <- function(x, name)
    !(name %in% names(x))

and use name_missing(x, "var") in your tests. (Pick your own name to make your code understandable if you don't like my choice.)

You could suggest to the tibble maintainers that they add a function like this.

Duncan Murdoch

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

Reply via email to