[datatable-help] best way of eval-ing a list of quoted expressions (Frank Erickson)

Frank Erickson fperickson at wisc.edu
Fri Jan 16 17:34:49 CET 2015


Ah, good idea. That's what I'll do next time.

I hadn't realized that "names" could look inside a quoted/language object.

Thanks!

On Fri, Jan 16, 2015 at 9:56 AM, Juan Manuel Truppia <jmtruppia at gmail.com>
wrote:

> With a little more work you could keep the definitions with the names.
> Here is how
>
> dt <- data.table(a = runif(10))
> ee <- quote(list(3 * a, a +2))
> dt[, names(ee)[-1] := eval(ee)]
>
> Sorry, hope this now sticks to the thread
>
> On Fri Jan 16 2015 at 11:19:57 AM Frank Erickson <fperickson at wisc.edu>
> wrote:
>
>> Thanks! I keep forgetting that I can eval() a larger statement. I think
>> I'll stick to an option that keeps the names close to the definitions for
>> now, though.
>>
>> By the way, you replied to the r-forge forum "digest," outside of the
>> original thread. I might've missed the reply if there weren't so few active
>> conversations.
>>
>> On Thu, Jan 15, 2015 at 11:07 AM, Juan Manuel Truppia <
>> jmtruppia at gmail.com> wrote:
>>
>>> I don't know what you are trying to achieve, but I usually quote the
>>> list, instead of generating a list of quotes. I think that your issue is
>>> similar to something I've faced in the past, and I usually solve it like
>>> this
>>>
>>> dt <- data.table(a = runif(10))
>>> ee <- quote(list(3 * a, a +2))
>>> dt[, c("b", "c") := eval(ee)]
>>>
>>> I still don't know how to define the column names in the quoted
>>> expression, instead of in the `:=` call.
>>>
>>> Hope it helps
>>>
>>>
>>> On Thu Jan 15 2015 at 8:00:10 AM <
>>> datatable-help-request at lists.r-forge.r-project.org> wrote:
>>>
>>>> Send datatable-help mailing list submissions to
>>>>         datatable-help at lists.r-forge.r-project.org
>>>>
>>>> To subscribe or unsubscribe via the World Wide Web, visit
>>>>         https://lists.r-forge.r-project.org/cgi-bin/mailman/
>>>> listinfo/datatable-help
>>>>
>>>> or, via email, send a message with subject or body 'help' to
>>>>         datatable-help-request at lists.r-forge.r-project.org
>>>>
>>>> You can reach the person managing the list at
>>>>         datatable-help-owner at lists.r-forge.r-project.org
>>>>
>>>> When replying, please edit your Subject line so it is more specific
>>>> than "Re: Contents of datatable-help digest..."
>>>>
>>>>
>>>> Today's Topics:
>>>>
>>>>    1. best way of eval-ing a list of quoted expressions (Frank Erickson)
>>>>
>>>>
>>>> ----------------------------------------------------------------------
>>>>
>>>> Message: 1
>>>> Date: Wed, 14 Jan 2015 17:06:36 -0500
>>>> From: Frank Erickson <fperickson at wisc.edu>
>>>> To: "data.table help" <datatable-help at lists.r-forge.r-project.org>
>>>> Subject: [datatable-help] best way of eval-ing a list of quoted
>>>>         expressions
>>>> Message-ID:
>>>>         <CAJd-hdmsub_h_oh2rGrBuvbGFCk4S9ZoTMi+
>>>> FrfEssH9mqoLiA at mail.gmail.com>
>>>> Content-Type: text/plain; charset="utf-8"
>>>>
>>>> Hi,
>>>>
>>>> I'm wondering what the most idiomatic or efficient approach is...?
>>>> Here's
>>>> my example:
>>>>
>>>> expr_nonlin = list(
>>>>   early = quote(tt/TT*(tt/TT < .2)),
>>>>   late  = quote(tt/TT*(tt/TT > .8))
>>>> )
>>>>
>>>> # eval on a single expr works
>>>> data.table(tt=1,TT=100)[,early:=eval(expr_nonlin$early)][]
>>>>
>>>> # lapply eval does not work
>>>> data.table(tt=1,TT=100)[,names(expr_nonlin):=lapply(
>>>> expr_nonlin,eval)][]
>>>>
>>>> # (1) envir fixes it
>>>> DT <- data.table(tt=1,TT=100)
>>>> DT[,names(expr_nonlin):=lapply(expr_nonlin,eval,envir=DT)][]
>>>>
>>>> # (2) or a for loop
>>>> DT <- data.table(tt=1,TT=100)
>>>> for (i in names(expr_nonlin)) DT[,(i):=eval(expr_nonlin[[i]])]
>>>>
>>>> (1) and (2) both work. Is either preferable?
>>>>
>>>> (1) calls [.data.table fewer times, but messes around with environments,
>>>> which always seem fragile.
>>>>
>>>> ------------------
>>>>
>>>> One more quick question: In approach (1), is there a way to skip the
>>>> names(zzz):= part? I see that this doesn't work:
>>>>
>>>> DT <- data.table(tt=1,TT=100)
>>>> DT[,do.call(`:=`,lapply(expr_nonlin,eval,envir=DT))][]
>>>>
>>>>
>>>> Thanks,
>>>>
>>>> Frank
>>>> -------------- next part --------------
>>>> An HTML attachment was scrubbed...
>>>> URL: <http://lists.r-forge.r-project.org/pipermail/
>>>> datatable-help/attachments/20150114/035b1682/attachment-0001.html>
>>>>
>>>> ------------------------------
>>>>
>>>> _______________________________________________
>>>> datatable-help mailing list
>>>> datatable-help at lists.r-forge.r-project.org
>>>> https://lists.r-forge.r-project.org/cgi-bin/mailman/
>>>> listinfo/datatable-help
>>>>
>>>> End of datatable-help Digest, Vol 59, Issue 2
>>>> *********************************************
>>>>
>>>
>>> _______________________________________________
>>> datatable-help mailing list
>>> datatable-help at lists.r-forge.r-project.org
>>>
>>> https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/datatable-help
>>>
>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/datatable-help/attachments/20150116/a73de8d9/attachment-0001.html>


More information about the datatable-help mailing list