[datatable-help] ggplot2 and data.table

Timothée Carayol timothee.carayol at gmail.com
Sun Aug 14 22:50:01 CEST 2011


Hi,

For some time I have been wishing that data.table and ggplot2 could play a
bit nicer together.
For example, I would like this to work but it doesn't:

> test <- data.table(a=1:10, b=1:10)
> test[, ggplot() + geom_line(aes(x=a, y=b))]
Error in eval(expr, envir, enclos) : object 'a' not found

I spent a few dozen minutes trying to understand what was going on (and
stumbling upon this useful advice from Hadley
Wickham<http://stackoverflow.com/questions/3737619/how-can-i-pass-a-ggplot2-aesthetic-from-a-variable>),
and it turns out that it's very easy to fix (though the fix is not very
pretty).
Datatable-help, I present you with.. aesDT and ggplotDT.


aesDT <- function(...) {
 aes <- structure(list(...),  class = "uneval")
 rename_aes(aes)
}

Using aesDT() instead of aes() whenever you are in a data.table (or in a
with()) will now work. That is pretty much all you need, but I thought I'd
go just one tiny step further with ggplotDT():

ggplotDT <- function(...) {
 ggplot(, aes_now(...))
}

which makes the following possible:

test[, ggplotDT(x=a, y=b) + geom_line()]

i.e. put the aesthetics directly as arguments, saving a few keystrokes and a
pair of brackets.
Tiny problem that I have yet to solve: you now have to explicitly give the
name of all the aesthetics; aes() is sufficiently clever to guess them if
they're in the right order, but the logic does not seem to carry over
straightforwardly to aesDT().

I know I'll be using these, so I thought maybe other people here might be
interested.

Timothee
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/datatable-help/attachments/20110814/18b54c83/attachment.htm>


More information about the datatable-help mailing list