Hi -- I am currently at the useR! conference so my time to look into this is a bit limited -- as is my access to data and code which I remember to have required a coercion to data.frame in the past. When I have some time I'll experiment a bit more, before perhaps raising the issues with Hadley Wickham to see what his thoughts are.
I'll keep you updated. Cheers Timothee On Tue, Aug 16, 2011 at 7:26 AM, Matthew Dowle <[email protected]>wrote: > > Thanks a lot, that makes sense to me now ... > > On Mon, 2011-08-15 at 07:51 +0100, Timothée Carayol wrote: > > You are right -- I should have given a bit more context. > > > > > > 1) The usual ggplot2 syntax mostly works with data.tables, though > > sometimes coercing to a data.frame is necessary. I do not have a > > reproducible example of that at hand, but I thought it's probably > > something that would require a fix in ggplot2, and not data.table. > > I'll try to find you a reproducible example if that's useful. > > Yes please. > > > > > 2) What I wanted to allow, was to call ggplot inside a data.table > > call, e.g. > > > > > > test <- data.table( > > a=rnorm(4*26), > > b=letters > > ) > > test[, > > list(y=max(a)), > > by=b > > ][, > > ggplotDT(x=b, y=y) + > > geom_point() + > > scale_x_discrete("group") + > > scale_y_continuous("maximum") + > > coord_flip() > > ] > > > > > > I would otherwise have to create an object specifically to contain the > > data to plot, which often I find to be a superfluous step. But maybe > > that's just me, and that's a minor point anyway. > > > > > > By default, ggplot() (and more specifically aes()) looks only at two > > environments: the global environment, and the data.frame provided as > > its first argument. > > Ah. Is there any possibility of ggplot being changed to look in the > calling frame? > > > That means that with(DF, ggplot(, aes(...)) + ...) doesn't work; > > neither does DT[, ggplot(, aes(...)) + ...]. With aesDT, provided in > > my previous email, these uses become possible. > > Ok these seem like good additions to data.table (assuming ggplot can't > be changed). Does it have to be a different name (aesDT) or could there > be an aes in data.table masking the one in ggplot. Possibly aes could > be internal to data.table, not exported, so user wouldn't realise it's > being masked. Maybe that's a bad thing, though. Views? > > Matthew > > > > > On Aug 14, 2011 11:34 PM, "Matthew Dowle" <[email protected]> > > wrote: > > > > > > I'm not a ggplot2 expert by any means but I thought tests 167 and > > 168 > > > already tested compatibility. It needs to be called in the following > > > way, though : > > > > > > DT <- data.table(a=1:10, b=1:10) > > > ggplot(DT,aes(x=a,y=b))+geom_line() > > > > > > If you have ggplot2 loaded, then running test.data.table() should > > flash > > > up the ggplot2 plots. > > > > > > Are these forms ok or am I missing something? > > > > > > Matthew > > > > > > > > > On Sun, 2011-08-14 at 21:55 +0100, Timothée Carayol wrote: > > >> Ah sorry -- the definition of ggplotDT() should be, of course: > > >> > > >> > > >> ggplotDT <- function(...) { > > >> ggplot(, aesDT(...)) > > >> } > > >> > > >> > > >> (aes_now() was an artifact from Hadley Wickham's Stack Overflow > > tip) > > >> > > >> > > >> t > > >> > > >> > > >> > > >> 2011/8/14 Timothée Carayol <[email protected]> > > >> 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), 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 > > >> > > >> > > >> _______________________________________________ > > >> datatable-help mailing list > > >> [email protected] > > >> > > > https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/datatable-help > > > > > > > > > > >
_______________________________________________ datatable-help mailing list [email protected] https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/datatable-help
