data.table
論理列があります。i
論理列の名前を引数に直接使用できないのはなぜですか? 例を参照してください。
dt <- data.table(x = c(T, T, F, T), y = 1:4)
# Works
dt[dt$x]
dt[!dt$x]
# Works
dt[x == T]
dt[x == F]
# Does not work
dt[x]
dt[!x]
data.table
論理列があります。i
論理列の名前を引数に直接使用できないのはなぜですか? 例を参照してください。
dt <- data.table(x = c(T, T, F, T), y = 1:4)
# Works
dt[dt$x]
dt[!dt$x]
# Works
dt[x == T]
dt[x == F]
# Does not work
dt[x]
dt[!x]
から?data.table
高度:
i
が単一の変数名の場合、列名の式とは見なされず、呼び出しスコープで評価されます。
したがって、呼び出しスコープ(この場合はグローバル環境)でdt[x]
評価しようとしますx
(
または{
またはを使用してこれを回避できます。force
dt[(x)]
dt[{x}]
dt[force(x)]
x
グローバル環境で定義されていません。これを試してみると、
> with(dt, dt[x])
x y
1: TRUE 1
2: TRUE 2
3: TRUE 4
それはうまくいくでしょう。またはこれ:
> attach(dt)
> dt[!x]
x y
1: FALSE 3
編集:
ドキュメントによると、j
パラメーターは実際には列名を取ります:
> dt[x]
Error in eval(expr, envir, enclos) : object 'x' not found
> dt[j = x]
[1] TRUE TRUE FALSE TRUE
次に、i
パラメーターは数値式または論理式のいずれかを取ります (x 自体のように) x
。
> 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
これも機能するはずであり、間違いなくより自然です。
setkey(dt, x)
dt[J(TRUE)]
dt[J(FALSE)]