如何在tidypolars管道中强制指定代码的求值顺序?
在tidypolars管道中强制指定代码求值顺序的方法
tidypolars的dplyr风格接口会将管道内的表达式翻译成Polars查询计划,不会自动在R环境中求值未被支持的外部函数(比如lubridate::today()),这就是直接在filter里写函数调用报错的原因。要强制在R侧先完成求值,再将结果传入管道,有两种简洁的方法:
方法1:使用!!(bang-bang)运算符强制注入求值结果
!!是rlang包的非标准求值工具,能将右侧表达式在当前环境中先求值,再把结果注入到tidypolars的过滤条件中:
lf %>% filter(date >= !! (lubridate::today(tzone = "") - lubridate::days(3))) %>% collect()
方法2:使用local()包裹需要提前求值的代码
local()会强制内部代码在当前R环境中完成求值,再将最终的日期值传递给filter:
lf %>% filter(date >= local(lubridate::today(tzone = "") - lubridate::days(3))) %>% collect()
为什么eval()/force()不行?
tidypolars会把eval、force这类函数当作需要翻译到Polars的表达式一部分,而不是触发R侧的求值。而!!和local()是在tidypolars处理表达式之前就完成了求值,传递给filter的是一个具体的日期值,和提前赋值给变量的逻辑完全一致。
内容的提问来源于stack exchange,提问作者crestor
相关产品推荐
相关产品推荐

