I have a data.table
with a logical column. Why the name of the logical column can not be used directly for the i
argument? See the example.
From ?data.table
Advanced: When
i
is a single variable name, it is not considered an expression of column names and is instead evaluated in calling scope.
So dt[x]
will try to evaluate x
in the calling scope (in this case the global environment)
You can get around this by using (
or {
or force
dt[(x)]
dt[{x}]
dt[force(x)]
This should also work and is arguably more natural:
setkey(dt, x)
dt[J(TRUE)]
dt[J(FALSE)]
x
is not defined in the global environment. If you try this,
> with(dt, dt[x])
x y
1: TRUE 1
2: TRUE 2
3: TRUE 4
It would work. Or this:
> attach(dt)
> dt[!x]
x y
1: FALSE 3
EDIT:
according to the documentation the j
parameter takes column name, in fact:
> dt[x]
Error in eval(expr, envir, enclos) : object 'x' not found
> dt[j = x]
[1] TRUE TRUE FALSE TRUE
then, the i
parameter takes either numerical or logical expression (like x itself should be), however it seems it (data.table) can't see x
as logical without this:
> dt[i = x]
Error in eval(expr, envir, enclos) : object 'x' not found
> dt[i = as.logical(x)]
x y
1: TRUE 1
2: TRUE 2
3: TRUE 4