Подтвердить что ты не робот

Подмножество data.table с использованием переменных с тем же именем, что и в столбце

Я хочу подмножить data.table с помощью переменной, которая имеет то же имя, что и столбец, который ссылается на некоторые проблемы:

dt <- data.table(a=sample(c('a', 'b', 'c'), 20, replace=TRUE),
                 b=sample(c('a', 'b', 'c'), 20, replace=TRUE),
                 c=sample(20), key=c('a', 'b'))

evn <- environment()
a <- 'b'
dt[a == a]

#Expected Result
dt[a == 'b']

Я встретил это возможное решение:

env <- environment()
dt[a == get('a',env)]

Но это так же неудобно, как:

this.a = a
dt[a == this.a]

Итак, есть ли еще одно элегантное решение?

4b9b3361

Ответ 1

На данный момент временное решение может быть

`..` <- function (..., .env = globalenv())
{
  get(deparse(substitute(...)), env = .env)
}

..(a)
## [1] "b"

dt[a==..(a)]
##    a b  c
## 1: b a 15
## 2: b a 11
## 3: b b  8
## 4: b b  4
## 5: b c  5
## 6: b c 12

Хотя это выглядит элегантно, я все еще жду более надежного решения таких проблем с объемами.

Отредактировано в соответствии с предложением @mnel,

`..` <- function (..., .env = sys.parent(2))
{
  get(deparse(substitute(...)), env = .env)
}

Ответ 2

Теперь все просто (поскольку синтаксис ..() введен в data.table):

dt[eval(dt[, a %in% ..a])]

или даже проще в вашем конкретном случае (поскольку a является 1-м столбцом):

dt[eval(.(a))] # identical to dt["b"]