[datatable-help] Environment of eval() execution for "j" appears to vary inexplicably
Harish
harishv_99 at yahoo.com
Thu Jul 1 06:04:26 CEST 2010
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