这似乎是一个非常简单的问题,但是它的解决方案使我无法进行大约90分钟的尝试,搜索和阅读手册以及在线学习。

说我有一个data.table:

DT<-data.table(a=runif(n = 10),b=runif(n = 10),c=runif(n = 10))

显然,这样的事情有效:
DT[a > 0.5]

并给我DT的子集,其中“a”列中的值大于0.5。但是,如果我想变得更灵活些(因为该子集嵌入在更大的例程中),该怎么办?

我想做的是使此原型(prototype)功能起作用:
flexSubset<-function(sColumnToSubset,dMin){
subs<-DT[sColumnToSubset>dMin]
return(subs)
}

我尝试了许多失败的尝试,但都没有成功...
with=FALSE

有什么建议么?非常感谢您提前抽出宝贵的时间!

最佳答案

如果要传递字符串,请执行以下操作:

flexSubset = function(sColumnToSubset, dMin)
                DT[get(sColumnToSubset) > dMin]

flexSubset("a", 0.5)

如果要传递未计算的表达式,则:
flexSubset = function(sColumnToSubset, dMin) {
                lhs = substitute(sColumnToSubset)
                DT[eval(lhs) > dMin]
             }

flexSubset(a, 0.5)
flexSubset(a / b, 0.5)

10-06 01:46