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
