Mainly it is that I am writing some library functions that I and a few others may be using. I don&#39;t want those functions to have to depend on data.table because I don&#39;t want it to need to be installed for a purpose that has nothing to do with it. But I use data.tables as input. Here is a psuedo example<div>

<br></div><div>MyFunc &lt;- function(data, numerator.var, denominator.var)</div><div>{</div><div>  data &lt;- data[order(data[,numerator.var])]</div><div>  data$metric &lt;- data[, numerator.var] / data[, denominator.var]</div>

<div>  data$cum.metric &lt;- cumsum(data$metric)</div><div><br></div><div>  return(data)</div><div>}</div><div><br></div><div>I make this example to show that I need to preserve the whole data variable the whole way through and return a modified version.  If I do </div>

<div><br></div><div>data &lt;- as.data.frame(data)</div><div><br></div><div>as the first line of that function, then I lose the keys in a potential data.table that is passed in.  If I use</div><div><br></div><div>data &lt;- as.data.table(data)</div>

<div><br></div><div>and change the subsetting to be data.table compliant, then I am forcing someone to have a whole package loaded for something that can be done in the base language fine. There must be an agnostic way to do this. Apparently subset doesn&#39;t do it either if keys get lost.</div>

<div><br></div><div>-Chris</div><div><br><div class="gmail_quote">On 20 July 2011 08:48, 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>
Hi Chris,<br>
<br>
If you&#39;re writing a package and don&#39;t want to worry if someone passes your<br>
package a data.table, then don&#39;t worry; just use data.frame syntax and<br>
your non-datatable-aware package will work fine.<br>
<br>
If you&#39;re writing your own code you&#39;re in control of, just embrace the<br>
data.table ;)<br>
<br>
If you&#39;re writing a function in an environment which is data.table aware,<br>
but you want your function to accept either data.frame or data.table, then<br>
at the beginning of your function just do :<br>
<br>
f = myfunction(x) {<br>
    x = as.data.table(x)<br>
    # proceed with data.table syntax<br>
}<br>
<br>
or<br>
<br>
f = myfunction(x) {<br>
    x = as.data.frame(x)<br>
    # proceed with data.frame syntax<br>
}<br>
<br>
Some of the CRAN packages that depend on data.table are doing that, I think.<br>
<br>
In R itself it is common practice to coerce arguments to a common type and<br>
then proceed with the appropriate syntax for that type.  Consider that<br>
matrix syntax is different syntax to data.frame syntax. You often see<br>
as.classiwant() at the beginning of functions, or switches depending on<br>
the type of object.<br>
<br>
Remember that is.data.frame() is TRUE for both data.frame and data.table,<br>
but is.data.table() is TRUE only for data.table.  as.data.table() does<br>
nothing if x is already a data.table, and is an efficient class change if<br>
x is a data.frame.  Is efficiency the issue?<br>
<br>
Does that help?  If not, more info about the problem will be needed please.<br>
<font color="#888888"><br>
Matthew<br>
</font><div><div></div><div class="h5"><br>
<br>
&gt; I&#39;m used to seeing the column names at the bottom of the column too, but<br>
&gt; that is only if the data.table is long enough. My example was too short<br>
&gt; for<br>
&gt; that, so I made the same sort of mistake you did :(<br>
&gt;<br>
&gt; Okay, that is a way, but is it a good way? Not sure...<br>
&gt;<br>
&gt; 2011/7/20 Timothée Carayol &lt;<a href="mailto:timothee.carayol@gmail.com">timothee.carayol@gmail.com</a>&gt;<br>
&gt;<br>
&gt;&gt; Sorry my mistake -- subset does return a data.table.<br>
&gt;&gt; (I was using as an example a data.table with 100 rows, and stupidly<br>
&gt;&gt; using<br>
&gt;&gt; the fact that it printed the whole thing rather than the 10 first rows<br>
&gt;&gt; only<br>
&gt;&gt; as my criterion for whether it worked or not.. Omitting that<br>
&gt;&gt; print.data.table does print up to 100 rows. I feel a bit stupid.)<br>
&gt;&gt;<br>
&gt;&gt; Why doesn&#39;t it work for you if that is the case?<br>
&gt;&gt;<br>
&gt;&gt; DF &lt;- data.frame(a=1:200, b=1:10)<br>
&gt;&gt; DT &lt;- as.data.table(DF)<br>
&gt;&gt; subDT &lt;- subset(DT, select=a)<br>
&gt;&gt; class(DT)<br>
&gt;&gt; subDF &lt;- subset(DF, select=a)<br>
&gt;&gt; class(DF)<br>
&gt;&gt; identical(as.data.frame(DT), DF)<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; On Wed, Jul 20, 2011 at 12:50 PM, Chris Neff &lt;<a href="mailto:caneff@gmail.com">caneff@gmail.com</a>&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt;&gt; Yeah I realized that myself.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Another one: the function &quot;with&quot; doesn&#39;t seem to do what I want... but<br>
&gt;&gt;&gt; at<br>
&gt;&gt;&gt; least it is consistent!<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; 2011/7/20 Timothée Carayol &lt;<a href="mailto:timothee.carayol@gmail.com">timothee.carayol@gmail.com</a>&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; Sorry --<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; subset() was a poor idea, as it will return a data.frame even if the<br>
&gt;&gt;&gt;&gt; argument is a data.table..<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; 2011/7/20 Timothée Carayol &lt;<a href="mailto:timothee.carayol@gmail.com">timothee.carayol@gmail.com</a>&gt;<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; Hi--<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; You can use the subset() command with the select= option; not sure<br>
&gt;&gt;&gt;&gt;&gt; it&#39;s<br>
&gt;&gt;&gt;&gt;&gt; the best solution, though.<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; Timothee<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; On Wed, Jul 20, 2011 at 12:26 PM, Chris Neff &lt;<a href="mailto:caneff@gmail.com">caneff@gmail.com</a>&gt;<br>
&gt;&gt;&gt;&gt;&gt; wrote:<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt; I have a function where I pass a data frame and some variable names<br>
&gt;&gt;&gt;&gt;&gt;&gt; to<br>
&gt;&gt;&gt;&gt;&gt;&gt; calculate statistics on. However, I am at a loss as to how to write<br>
&gt;&gt;&gt;&gt;&gt;&gt; it<br>
&gt;&gt;&gt;&gt;&gt;&gt; correctly so that both data.frame and data.table work with it. If I<br>
&gt;&gt;&gt;&gt;&gt;&gt; have:<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt; DF = data.frame(x=1:10,y=2:11,z=3:12)<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt; DT = data.table(DF)<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt; var.names = c(&quot;x&quot;,&quot;y&quot;)<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt; I can do the following things to subset:<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt; DT[,var.names,with=FALSE]<br>
&gt;&gt;&gt;&gt;&gt;&gt; DF[,var.names]<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt; but of course DT[,var.names] won&#39;t give me back what I want, and<br>
&gt;&gt;&gt;&gt;&gt;&gt; DF[,var.names,with=FALSE] returns an error because with doesn&#39;t<br>
&gt;&gt;&gt;&gt;&gt;&gt; exist there.<br>
&gt;&gt;&gt;&gt;&gt;&gt; So how do I do this?<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt; Thanks,<br>
&gt;&gt;&gt;&gt;&gt;&gt; -Chris<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt; _______________________________________________<br>
&gt;&gt;&gt;&gt;&gt;&gt; datatable-help mailing list<br>
&gt;&gt;&gt;&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;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&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;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;<br>
&gt; _______________________________________________<br>
&gt; datatable-help mailing list<br>
&gt; <a href="mailto:datatable-help@lists.r-forge.r-project.org">datatable-help@lists.r-forge.r-project.org</a><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;<br>
<br>
<br>
</div></div></blockquote></div><br></div>