在数据框的上下文中评估操作

Evaluate an operation in a dataframe's context

我正在使用包中的公式,我想删除所有 non-numeric 项。

我的问题是,由于基本公式可能包含运算,我无法直接计算某些项。

这是一个代表:

datax=mtcars
op = c("mpg", "log(mpg)", "ifelse(mpg>2, '>2', '<=2')")
sapply(op, function(x){ is.numeric(datax[[x]]) })
#T,F,F
sapply(op, function(x){ is.numeric(with(data, get(x))) })
#Error in get(x) : object 'log(mpg)' not found

#Expected output:
#T,T,F

我知道我可以使用 attach(datax) 但这个功能非常 not recommended 我宁愿避免使用它。

有没有办法在数据帧的上下文中评估操作,以便我可以测试结果是否为数字?

注意:我不确定我的标题应该是关于评估或公式术语删除的,请随时提出修改建议。

一种选择是使用 eval(parse()),即

sapply(op, function(i) {is.numeric(with(mtcars, eval(parse(text = i))))})

#                       mpg                   log(mpg) ifelse(mpg>2, '>2', '<=2') 
#                      TRUE                       TRUE                      FALSE 

使用tidyverse

library(purrr)
library(rlang)
map_lgl(parse_exprs(op), ~ eval_tidy(.x, data = datax) %>%
              is.numeric)
#[1]  TRUE  TRUE FALSE