[Rd] obstacles to using vectors with attributes

Jim Regetz regetz at nceas.ucsb.edu
Wed Apr 16 01:37:39 CEST 2008


Hi all,

I am working on an application in which we'd like to use attributes to 
attach simple metadata to arbitrary R objects. It is essential that all 
functions that will work on the original object will also work on the 
object after metadata attributes have been added. However, this is not 
always the case for vectors: functions such as barplot, diffinv, and rle 
use is.vector, which (as documented and as discussed previously on this 
list) returns FALSE for a vector that has any attributes other than 
"names". For example,

 > x <- 1:3
 > attr(x, "date") <- date()
 > barplot(x)
Error in barplot.default(x) : 'height' must be a vector or a matrix

It strikes me that is.vector may be an overly strict test in these 
cases. Shouldn't barplot(x) behave the same regardless of whether vector 
x has any (non-special) attributes? In barplot.default, what if 
is.vector(x) were replaced with something along the lines of:
	is.atomic(x) && is.null(dim(x))

Admittedly, other functions currently using is.vector may require 
something slightly different. One such example is data.frame, which uses 
is.vector when applying recycling rules. It appears it is used at least 
in part to filter out AsIs objects, so a specific test of whether the 
object class is AsIs may be appropriate?

No doubt a slew of functions in user-contributed packages use is.vector 
in similar fashion, so even modifying core functions wouldn't fully 
solve our particular problem. On that note, I don't suppose there's hope 
of revisiting the definition of is.vector itself? Bear in mind, I do 
appreciate that there are good reasons for its current behavior, and 
compatibility constraints on changing it.

Thanks,
Jim

------------------------------
James Regetz, Ph.D.
Scientific Programmer/Analyst
National Center for Ecological Analysis & Synthesis
735 State St, Suite 300
Santa Barbara, CA 93101



More information about the R-devel mailing list