如何在data.table的j表达式中无需指定.envir即可使用glue()
在data.table的j表达式中简化glue()的使用方法
直接在data.table的j表达式里调用glue()会报错找不到列名,这是因为glue()默认使用的环境不是data.table当前的行/分组环境。指定.envir = .SD可以解决问题,但每次都加这个参数太麻烦。
你可以封装一个自定义函数,自动指定正确的环境,不用手动传参:
glue1 <- function(...) { glue(..., .envir = parent.frame()) }
测试示例
library(data.table) library(glue) data(iris) dt.iris <- data.table(iris) # 直接使用封装后的glue1,无需额外指定.envir dt.iris[, myText := glue1('The species is {Species} with sepal length of {Sepal.Length}')] # 查看生成的结果 head(dt.iris$myText)
原理说明
在data.table的j表达式执行时,parent.frame()会指向当前的行/分组执行环境,这个环境里可以直接访问到所有列变量,效果和指定.envir = .SD完全一致,却省去了每次手动传参的步骤。
内容的提问来源于stack exchange,提问作者Vasily A
相关产品推荐
相关产品推荐

