[datatable-help] Report an unexpected behavior in data.table 1.5

Branson Owen branson.owen at gmail.com
Thu Sep 2 22:29:55 CEST 2010


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 <branson.owen at gmail.com>:
> 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 <mdowle at mdowle.plus.com>:
>> 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,
>


More information about the datatable-help mailing list