[datatable-help] Environment of eval() execution for "j" appears to vary inexplicably

mdowle at mdowle.plus.com mdowle at mdowle.plus.com
Thu Jul 1 11:01:37 CEST 2010


I've seen that before. For me it was because version 1.4.1 of data.table
was still knocking around.  For me I looked at loadedNamespaces() and it
listed data.table, but search() did not.

The loop happens because of the particular changes that have happened
between 1.4.1 and latest 1.5, AND having both versions somehow visible to
R at the same time, in some way conflicting with each other. Or at least
thats what it was for me.

To be sure, start R with --vanilla, for me on ubuntu I have to "sudo R
--vanilla" anyway because of permissions (which I like).

Then install.packages(...) to cleanly install. Then restart R. The error
should go away?


> Matthew,
>
> Thanks for the fix.  It almost works...  I tested it on Rev 101 binaries.
>
> I get an extra line of output for the test case #1 I mentioned...
>
>> foo1( A )  # Test 1
> [1] TRUE
> [1] A C
> Levels: A C D
> [1] A C
> Levels: A C D
> Error: evaluation nested too deeply: infinite recursion /
> options(expressions=)?
>>
>
> Please note that I get an error at the end.  Though, the output seems to
> be right.
>
>
> Regards,
> Harish
>
>
> --- On Tue, 6/29/10, Matthew Dowle <mdowle at mdowle.plus.com> wrote:
>
>> From: Matthew Dowle <mdowle at mdowle.plus.com>
>> Subject: Re: [datatable-help] Environment of eval() execution for "j"
>> appears to vary inexplicably
>> To: "Harish" <harishv_99 at yahoo.com>
>> Cc: datatable-help at lists.r-forge.r-project.org
>> Date: Tuesday, June 29, 2010, 1:43 PM
>> Yes, that was reproducible, thanks.
>>
>> The last commit 101 fixes this one too, I think. Please
>> confirm.
>>
>> A = data.table(a=c("A","C","D"), Count=c(4L,8L,1L))
>>
>> > foo1(A)
>> [1] TRUE
>> [1] A C
>> Levels: A C D
>> [1] A C
>> Levels: A C D
>>
>> > foo2(A,a)
>> [1] TRUE
>> [1] A C
>> Levels: A C D
>> [1] A C
>> Levels: A C D
>> [1] A C D
>> Levels: A C D (Other)
>> >
>>
>> Matthew
>>
>>
>> On Sat, 2010-06-26 at 00:28 -0700, Harish wrote:
>> > I am running into a peculiar issue which seems to be
>> related to the environment in which the eval() is executed
>> when passed as the "j".  The environment of execution
>> of the eval() seems to vary depending on whether I pass in a
>> variable (of class "name") or an equivalent expression is
>> typed inside the eval.
>> >
>> > === Example code ===
>> >
>> > A <- structure(list(a = structure(1:3, .Label =
>> c("A", "C", "D"), class = "factor"),
>> >     Count = c(4L, 8L, 1L)), .Names
>> = c("a", "Count"), class = "data.table")
>> >
>> > foo1 <- function(DT) {
>> >    dtRet <- DT[ ,
>> >         
>>    list( Count=sum( Count ) ),
>> >         
>>    by=list( Category=foo2( DT, a ) )
>> >          ]
>> >    invisible()
>> > }
>> >
>> >
>> > foo2 <- function( DT, v ) {
>> >    q <- substitute( v )
>> >
>> >    print( identical( q, substitute( v ) )
>> )   # TRUE as expected
>> >    print( DT[ 1:2, eval( q ) ] )
>> >    print( DT[ 1:2, eval( substitute( v ) ) ]
>> )
>> >    return( structure(1:3, .Label = c("A",
>> "C", "D", "(Other)"), class = "factor") )
>> > }
>> >
>> > foo1( A ) # Test 1
>> > foo2( A, a ) # Test 2
>> > === End code ===
>> >
>> > In Test 1, when I run foo1(), I am essentially
>> executing
>> >    foo2( A, a ) from within the code of the
>> data table.
>> >
>> > I get:
>> > [1] TRUE
>> > [1] A C
>> > Levels: A C D
>> > [1] A C D
>> > Levels: A C D
>> >
>> > Issue #1 ==> The third print in foo2() is actually
>> returning 3 items when I am requesting only the first 2
>> items.  (Also, in my more complex program, it seemed to
>> return the data in alphabetical order or the order of the
>> factor levels rather than in the order of the data in the
>> table.  However, I am not able to reproduce this in a
>> simpler example.  I am hoping that this behavior will
>> also be rectified with any bug fixes you make.)
>> >
>> > In Test 2, I run foo2() directly in .GlobalEnv, but I
>> am passing in the same data that foo1() would have passed it
>> in Test 1.
>> >
>> > I get:
>> > [1] TRUE
>> > [1] A C
>> > Levels: A C D
>> > Error in eval(expr, envir, enclos) : object 'a' not
>> found
>> >
>> > Issue #2 ==> It looks like if I have an expression
>> inside eval(), it is executed in a different environment as
>> the prior print statement where I have an eval() with just a
>> single variable.  Technically, I would expect both to
>> be equivalent.
>> >
>> >
>> > I hope I clearly explained what my issues are.
>> >
>> >
>> > Regards,
>> > Harish
>> >
>> >
>> >
>> >       
>> > _______________________________________________
>> > 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
>>
>>
>>
>
>
>
>




More information about the datatable-help mailing list