我認爲eval(parse(text()))
會工作,你只需要一些修改。試試這個:
library(data.table)
iris <- data.table(iris)
#Updated so it will have quotes in your string
vars <- '\"setosa\"'
#Update so you can change your vars
filter <- paste0('Species==',vars,'& Petal.Length >= 4')
res <- iris[eval(parse(text=filter)), list(
sep.len.tot = sum(Sepal.Length)
, sep.width.total = sum(Sepal.Width)
), by = 'Species']
的幾個注意事項:我更新了vars
字符串中這樣就會有行情,以便正常運行,我也更新filter
這樣你就可以動態地改變0。
最後,爲了便於說明,得到的DF是空白(因爲沒有setosa品種有Petal.Length> = 4。因此,爲了看到這項工作,我們就可以去掉最後一個條件。
filter <- paste0('Species==',vars)
res2 <- iris[eval(parse(text=filter)), list(
sep.len.tot = sum(Sepal.Length)
, sep.width.total = sum(Sepal.Width)
), by = 'Species']
res2
Species sep.len.tot sep.width.total
1: setosa 250.3 171.4
編輯: 每@下面弗蘭克的評論,更清潔的方法是編寫整個事情作爲表達式:
filter <- substitute(Species == vars, list(vars = "setosa"))
res <- iris[eval(filter), list(
sep.len.tot = sum(Sepal.Length)
, sep.width.total = sum(Sepal.Width)
), by = 'Species']
啊,使一個很大的意義!非常感謝! – AlexP
我想在表達式中替換是比較乾淨的,而不是粘貼和解析。我的意思是'filter < - substitute(Species == vars&Petal.Length> = 4,list(vars =「setosa」));虹膜[eval(filter)]' – Frank
哦,哇,不知道你能做到這一點。我會編輯我的答案,謝謝@Frank! –