Great stuff thanks for the details. That gives me enough to go on. Will try to look at the weekend ... Matthew
> Sigh, I gave you some misleading information. I was saying that it > doesn't work within function, and work in global. I was wrong. It > doesn't work even in global in 1.5. > >> data.table(A=1:10,B=rnorm(10),key="A")[eval(parse(text="B>0"))] > Error in `[.data.table`(data.table(A = 1:10, B = rnorm(10), key = "A"), : > i has not evaluated to logical, integer or double > > What I was using eval(...) in global is j expression, i.e. > [,eval(...)] rather than i expression [eval(...)] > data.table(A=1:10,B=rnorm(10),key="A")[,eval(parse(text="B"))] > > Apologize for the bothersome information. > > Best regards, > > 2010/9/2 Branson Owen <[email protected]>: >> Alright, my fault. I was reckless again. I forgot my standard R using >> data.table 1.4, and thus the problem doesn't exist. Now, I can give >> you the error example with standard R and appropriate data.table >> version. >> >>> fn <- function(criteria) >>> data.table(A=1:10,B=rnorm(10),key="A")[eval(parse(text=criteria))] >>> fn("B>0") >> >> [data.table 1.5] >> >> Error in `[.data.table`(data.table(A = 1:10, B = norm(10), key = "A"), >> : >> i has not evaluated to logical, integer or double >> >> [data.table 1.4] >> A B >> [1,] 3 0.67 >> [2,] 4 1.16 >> [3,] 6 1.01 >> [4,] 8 0.09 >> >> Again, the solution is to add {} around eval(...) >> >> ** Discussion of similar problems I have bumped into ** >> Is it an environment? namespace? or search.path? problem. (Sorry, at >> this moment I only have rough impression about these concepts) >> Anyway, I have bumped into this kind of problem three times including >> this one. Just want to summarize. Might help identify where the >> problem is. >> >> a. DT[J(unique(COL))] >> This is the bug Matthew just fixed. [...] can't see function defined >> outside. I was using {} wrapper to solve this problem. >> >> b. DT[...] can't see the local variable defined within a function in >> data.table 1.4. This bug is really painful. I have to defined some >> variables outside the function. Make it available in global >> environment. This bug has been fixed in 1.5 before I can report it. >> >> c. the bug I reported in the beginning >> >> The first two bugs belongs to data.table 1.4, and were fixed in >> current version 1.5. Bug (c) doesn't exist in 1.4. Thus, I suspect >> that fixing the (a) and (b) bugs caused the new bug (c)? >> >> Please take your time to look at it if you are interested. This bug is >> really a minor issue compared to bug (b), which I am glad has been >> fixed. >> >> Best regards, >> >> 2010/9/2 Branson Owen <[email protected]>: >>> Ha, I found the problem is caused by the special REvolution R 3.1.1 >>> when I tried to re-produce the error. The underlying R is 2.9.2 which >>> is not allowed for data.table 1.5 (I rebuild the package to remove the >>> version restriction). Sorry, I didn't check it on standard R first >>> (Usually, I do.) An embarrassing mistake. :-P I know my working >>> environment is dangerous, and I will upgrade to their new version 4.0 >>> soon, which is build on R-2.11.1. It was lucky that putting a {} >>> wrapper can solve my problem. >>> >>> Best regards, >>> >>> 2010/8/31 Matthew Dowle <[email protected]>: >>>> I just have 30 seconds for quick reply ... can see I'll need >>>> reproducible example for this one please; it will probably depend on >>>> contents of 'criteria', columns of DT and arguments of the function >>>> within which it fails. With that I can take a look later ... Thanks. >>>> On Tue, 2010-08-31 at 08:40 -0500, Branson Owen wrote: >>>>> Dear all, >>>>> I just updated my data.table package from 1.4 to 1.5 yesterday. Ran >>>>> into a small problem that has been solved. Just want to report it >>>>> since I don't quite understand it. >>>>> > DT[eval(parse(text = criteria))] >>>>> This command is working in 1.4, but not everywhere in 1.5. It show >>>>> this error message when called within a function. >>>>> Error in `[.data.table`(Data, eval(parse(text = criteria))) : >>>>> i has not evaluated to logical, integer or double >>>>> However, it works in global environment? My solution for a function >>>>> call is, again, wrap it with {}. Therefore, >>>>> >>>>> > DT[ { eval(parse(text = criteria)) } ] >>>>> >>>>> solved my new problem. >>>>> >>>>> It didn't behave like this in 1.4. I guess this is because of the >>>>> favor Matthew did for me for the DT[ { CJ } ] bug. If nothing can be >>>>> perfect, I pretty much like the current setup. There wasn't many >>>>> eval(), but there are lots of CJ/J in my codes. >>>>> >>>>> Just thought you will be interested. Thank you very much for your >>>>> efforts and great work. >>>>> >>>>> Best regards, >>> >> > _______________________________________________ datatable-help mailing list [email protected] https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/datatable-help
