<html><head><style>body{font-family:Helvetica,Arial;font-size:13px}</style></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px; color: rgba(0,0,0,1.0); margin: 0px; line-height: auto;">Hi Mick,</div><div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px; color: rgba(0,0,0,1.0); margin: 0px; line-height: auto;"><br></div><div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px; color: rgba(0,0,0,1.0); margin: 0px; line-height: auto;">Hope it went great!</div><div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px; color: rgba(0,0,0,1.0); margin: 0px; line-height: auto;"><br></div><div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px; color: rgba(0,0,0,1.0); margin: 0px; line-height: auto;">Yes, this isn’t particularly memory efficient as you materialise the first subset, only to subset again with your second condition. The query within `[…]` can be optimised much easier when compared to chained expressions. </div><div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px; color: rgba(0,0,0,1.0); margin: 0px; line-height: auto;">What’s the rationale here for doing it this way? To take advantage of automatic indexing? It’d be great to have auto indexing optimised for complex expressions like `typeID %in% showID & transactionType == side` but until then, setting key and subsetting would be the best way. </div> <br> <div id="bloop_sign_1424470792720536832" class="bloop_sign"><div style="font-family:helvetica,arial;font-size:13px">HTH,<br>Arun</div></div> <br><p style="color:#000;">On 20 Feb 2015 at 16:42:51, Mick Cooney (<a href="mailto:mickcooney@gmail.com">mickcooney@gmail.com</a>) wrote:</p> <blockquote type="cite" class="clean_bq"><span><div><div></div><div>I gave a talk about data.table last night to Dublin R and got a very
<br>interesting question at the end of it that I hadn't thought of before.
<br>
<br>I was showing how you can chain operations together in nice concise
<br>one liners, the specific example I gave was:
<br>
<br>show.dt <- trade.dt[typeID %in% showID]
<br>                            [transactionType == side]
<br>                            [, list(transactionID, transactTime,
<br>transactionType,
<br>                               typeID, typeName, quantity, price)];
<br>
<br>print(tail(show.dt, n = count));
<br>
<br>This code is written for the game Eve Online and is used to show the
<br>last n number of trades on one side of a trade that my character had
<br>done, and I used it as an example of operation chaining.
<br>
<br>I was asked at the end of talk if the chaining of the typeID and the
<br>transactionType was any different to using a logical AND, and my
<br>response was that I wasn't sure, but I figured it might be, as doing
<br>the logical AND would invoke a vector scan.
<br>
<br>He then asked about memory use, so in the above example, do all the
<br>subcopies of the tables get kept in memory during the invocation, in
<br>effect mushrooming the amount of memory required?
<br>
<br>If that was the case, I could imagine that for large tables it might
<br>be worth going with the logical operation to prevent the multiple
<br>copies being made?
<br>
<br>
<br>--  
<br>Mick Cooney
<br>mickcooney@gmail.com
<br>_______________________________________________
<br>datatable-help mailing list
<br>datatable-help@lists.r-forge.r-project.org
<br>https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/datatable-help
<br></div></div></span></blockquote></body></html>