<font face="courier new,monospace">Hi --<br></font><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">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&#39;ll experiment a bit more, before perhaps raising the issues with Hadley Wickham to see what his thoughts are. </font></div>

<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">I&#39;ll keep you updated.</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br>

</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">Cheers</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">Timothee</font></div><div><div class="gmail_quote">

<br></div><div class="gmail_quote">On Tue, Aug 16, 2011 at 7:26 AM, Matthew Dowle <span dir="ltr">&lt;<a href="mailto:mdowle@mdowle.plus.com">mdowle@mdowle.plus.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

<br>
Thanks a lot, that makes sense to me now ...<br>
<div class="im"><br>
On Mon, 2011-08-15 at 07:51 +0100, Timothée Carayol wrote:<br>
&gt; You are right -- I should have given a bit more context.<br>
&gt;<br>
&gt;<br>
&gt; 1) The usual ggplot2 syntax mostly works with data.tables, though<br>
&gt; sometimes coercing to a data.frame is necessary. I do not have a<br>
&gt; reproducible example of that at hand, but I thought it&#39;s probably<br>
&gt; something that would require a fix in ggplot2, and not data.table.<br>
&gt; I&#39;ll try to find you a reproducible example if that&#39;s useful.<br>
<br>
</div>Yes please.<br>
<div class="im"><br>
&gt;<br>
&gt; 2) What I wanted to allow, was to call ggplot inside a data.table<br>
&gt; call, e.g.<br>
&gt;<br>
&gt;<br>
&gt; test &lt;- data.table(<br>
&gt;                    a=rnorm(4*26),<br>
&gt;                    b=letters<br>
&gt;                    )<br>
&gt; test[,<br>
&gt;   list(y=max(a)),<br>
&gt;   by=b<br>
&gt; ][,<br>
&gt;   ggplotDT(x=b, y=y) +<br>
&gt;   geom_point() +<br>
&gt;   scale_x_discrete(&quot;group&quot;) +<br>
&gt;   scale_y_continuous(&quot;maximum&quot;) +<br>
&gt;   coord_flip()<br>
&gt; ]<br>
&gt;<br>
&gt;<br>
&gt; I would otherwise have to create an object specifically to contain the<br>
&gt; data to plot, which often I find to be a superfluous step. But maybe<br>
&gt; that&#39;s just me, and that&#39;s a minor point anyway.<br>
&gt;<br>
&gt;<br>
&gt; By default, ggplot() (and more specifically aes()) looks only at two<br>
&gt; environments: the global environment, and the data.frame provided as<br>
&gt; its first argument.<br>
<br>
</div>Ah. Is there any possibility of ggplot being changed to look in the<br>
calling frame?<br>
<div class="im"><br>
&gt; That means that with(DF, ggplot(, aes(...)) + ...) doesn&#39;t work;<br>
&gt; neither does DT[, ggplot(, aes(...)) + ...]. With aesDT, provided in<br>
&gt; my previous email, these uses become possible.<br>
<br>
</div>Ok these seem like good additions to data.table (assuming ggplot can&#39;t<br>
be changed).  Does it have to be a different name (aesDT) or could there<br>
be an aes in data.table masking the one in ggplot.  Possibly aes could<br>
be internal to data.table, not exported, so user wouldn&#39;t realise it&#39;s<br>
being masked. Maybe that&#39;s a bad thing, though. Views?<br>
<font color="#888888"><br>
Matthew<br>
</font><div><div></div><div class="h5"><br>
&gt;<br>
&gt; On Aug 14, 2011 11:34 PM, &quot;Matthew Dowle&quot; &lt;<a href="mailto:mdowle@mdowle.plus.com">mdowle@mdowle.plus.com</a>&gt;<br>
&gt; wrote:<br>
&gt; &gt;<br>
&gt; &gt; I&#39;m not a ggplot2 expert by any means but I thought tests 167 and<br>
&gt; 168<br>
&gt; &gt; already tested compatibility. It needs to be called in the following<br>
&gt; &gt; way, though :<br>
&gt; &gt;<br>
&gt; &gt; DT &lt;- data.table(a=1:10, b=1:10)<br>
&gt; &gt; ggplot(DT,aes(x=a,y=b))+geom_line()<br>
&gt; &gt;<br>
&gt; &gt; If you have ggplot2 loaded, then running test.data.table() should<br>
&gt; flash<br>
&gt; &gt; up the ggplot2 plots.<br>
&gt; &gt;<br>
&gt; &gt; Are these forms ok or am I missing something?<br>
&gt; &gt;<br>
&gt; &gt; Matthew<br>
&gt; &gt;<br>
&gt; &gt;<br>
&gt; &gt; On Sun, 2011-08-14 at 21:55 +0100, Timothée Carayol wrote:<br>
&gt; &gt;&gt; Ah sorry -- the definition of ggplotDT() should be, of course:<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; ggplotDT &lt;- function(...) {<br>
&gt; &gt;&gt; ggplot(, aesDT(...))<br>
&gt; &gt;&gt; }<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; (aes_now() was an artifact from Hadley Wickham&#39;s Stack Overflow<br>
&gt; tip)<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; t<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; 2011/8/14 Timothée Carayol &lt;<a href="mailto:timothee.carayol@gmail.com">timothee.carayol@gmail.com</a>&gt;<br>
&gt; &gt;&gt; Hi,<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; For some time I have been wishing that data.table and ggplot2<br>
&gt; &gt;&gt; could play a bit nicer together.<br>
&gt; &gt;&gt; For example, I would like this to work but it doesn&#39;t:<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; &gt; test &lt;- data.table(a=1:10, b=1:10)<br>
&gt; &gt;&gt; &gt; test[, ggplot() + geom_line(aes(x=a, y=b))]<br>
&gt; &gt;&gt; Error in eval(expr, envir, enclos) : object &#39;a&#39; not found<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; I spent a few dozen minutes trying to understand what was<br>
&gt; &gt;&gt; going on (and stumbling upon this useful advice from Hadley<br>
&gt; &gt;&gt; Wickham), and it turns out that it&#39;s very easy to fix (though<br>
&gt; &gt;&gt; the fix is not very pretty).<br>
&gt; &gt;&gt; Datatable-help, I present you with.. aesDT and ggplotDT.<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; aesDT &lt;- function(...) {<br>
&gt; &gt;&gt; aes &lt;- structure(list(...), class = &quot;uneval&quot;)<br>
&gt; &gt;&gt; rename_aes(aes)<br>
&gt; &gt;&gt; }<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; Using aesDT() instead of aes() whenever you are in a<br>
&gt; &gt;&gt; data.table (or in a with()) will now work. That is pretty much<br>
&gt; &gt;&gt; all you need, but I thought I&#39;d go just one tiny step further<br>
&gt; &gt;&gt; with ggplotDT():<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; ggplotDT &lt;- function(...) {<br>
&gt; &gt;&gt; ggplot(, aes_now(...))<br>
&gt; &gt;&gt; }<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; which makes the following possible:<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; test[, ggplotDT(x=a, y=b) + geom_line()]<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; i.e. put the aesthetics directly as arguments, saving a few<br>
&gt; &gt;&gt; keystrokes and a pair of brackets.<br>
&gt; &gt;&gt; Tiny problem that I have yet to solve: you now have to<br>
&gt; &gt;&gt; explicitly give the name of all the aesthetics; aes() is<br>
&gt; &gt;&gt; sufficiently clever to guess them if they&#39;re in the right<br>
&gt; &gt;&gt; order, but the logic does not seem to carry over<br>
&gt; &gt;&gt; straightforwardly to aesDT().<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; I know I&#39;ll be using these, so I thought maybe other people<br>
&gt; &gt;&gt; here might be interested.<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; Timothee<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; _______________________________________________<br>
&gt; &gt;&gt; datatable-help mailing list<br>
&gt; &gt;&gt; <a href="mailto:datatable-help@lists.r-forge.r-project.org">datatable-help@lists.r-forge.r-project.org</a><br>
&gt; &gt;&gt;<br>
&gt; <a href="https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/datatable-help" target="_blank">https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/datatable-help</a><br>
&gt; &gt;<br>
&gt; &gt;<br>
&gt;<br>
<br>
<br>
</div></div></blockquote></div><br></div>