我在character
中的表达式应该在data.table
(不重要的上下文)中进行评估。
为了确保所有必需的列都存在,我想在R表达式中提取所述列。
我想要的是什么:
library(data.table)
DT <- data.table(p001=rnorm(10),p002=rnorm(10),p003=rnorm(10))
expr <- 'p001+mean(p001,na.rm=TRUE)-weighted.mean(p002,w=p003)+someRandomOtherColumn'
# DT[,test:=p001+mean(p001,na.rm=TRUE)-weighted.mean(p002,w=p003)+someRandomOtherColumn]
# would fail as p004 is not in the columns
基本上我正在寻找一种从expr
p001,p002,p003,someRandomOtherColumn
中提取的方式(可能是正则表达式)。
我对它的看法:
我看到它的方式我应该能够使用一些正则表达式捕获p001,p001,TRUE,p002,p003,someRandomOtherColumn
,这些正则表达式会捕获f(,)
中的内容,然后过滤“允许的”列名称(TRUE
不是那种情况)
嵌套f(,,)
不是问题,因为我可以递归地调用相同的函数,嵌套的f(,(),)
也没问题。
我拥有的内容: 从现在开始这就是我所拥有的,这可以使用,但这感觉很糟糕
expr <- 'p001+mean(p001,na.rm=TRUE)-weighted.mean(p002,w=p003)+someRandomOtherColumn'
clean <- function(string) gsub(string, pattern='[_|\\.|a-zA-z]+\\(([^)]*)\\)', replacement='\\1', perl=TRUE)
clean(expr)
[1] "p001+p001,na.rm=TRUE-p002,w=p003+someRandomOtherColumn"
# Then I can remove =* than split on ,|+|-|*
答案 0 :(得分:3)
向表达式添加~
时,可以创建有效的R公式表达式:
expr <- '~ p001+mean(p001,na.rm=TRUE)-weighted.mean(p002,w=p003)+someRandomOtherColumn'
此字符串可以转换为as.formula
的公式。然后,可以使用all.vars
:
all.vars(as.formula(expr))
# [1] "p001" "p002" "p003" "someRandomOtherColumn"