我正在try 传递一个应该针对数据帧进行求值的表达式,本质上是对subset()
进行镜像.问题是,我需要能够在其他功能中使用它.
这实质上意味着保留表达式,直到合适的时间(即,调用类似子集的函数)才对其求值.
我最终能够成功的方法是通过传递env
和默认值sys.frame(sys.nframe())
,该值应该计算为函数的帧.缺点是,这需要是每个外部函数的参数,以保留嵌套属性:
f1 = function(x, expr, env=sys.frame(sys.nframe())){
expr = substitute(expr, env)
eval(expr, x)
}
f2 = function(x, expr, env=sys.frame(sys.nframe())){
f1(x, expr, env)
}
f3 = function(x, expr, env=sys.frame(sys.nframe())){
f2(x, expr, env)
}
f4 = function(x, expr){
f2(x, expr) # no env passing
}
m = head(mtcars, 2) # less typing
f1(m, mpg > 20) # TRUE TRUE -- expected
f2(m, mpg > 20) # TRUE TRUE -- yaay
f3(m, mpg > 20) # TRUE TRUE -- yaay
f4(m, mpg > 20) # expr -- naay :(
我可以重写f1
以使其自动展开调用堆栈并找到正确的env
来替换传递的表达式吗?