将表达式字符串转换为引用表达式

时间:2019-01-10 08:35:28

标签: r rlang tidyeval

如何将表达式字符串转换为可引用的表达式?

示例: 这是我想要的结果:

mutate(mtcars,answer=wt+wt)
# mpg   cyl disp  hp  drat wt    qsec   vs  am   gear carb    answer
# 1  21.0  6   160.0 110 3.90 2.620 16.46  0   1    4    4    5.240
# 2  21.0  6   160.0 110 3.90 2.875 17.02  0   1    4    4    5.750
# 3  22.8  4   108.0  93 3.85 2.320 18.61  1   1    4    1    4.640
# 4  21.4  6   258.0 110 3.08 3.215 19.44  1   0    3    1    6.430
# 5  18.7  8   360.0 175 3.15 3.440 17.02  0   0    3    2    6.880
# 6  18.1  6   225.0 105 2.76 3.460 20.22  1   0    3    1    6.920 
... 

这是我正在编写的函数:

f<-function(df,string_expression){
    se<-enexpr(string_expression)
    mutate(df,answer=!!se)
}

如果我使用以下功能调用,它将起作用:

f(mtcars,wt+wt)
# mpg   cyl disp  hp  drat wt    qsec   vs  am   gear carb    answer
# 1  21.0  6   160.0 110 3.90 2.620 16.46  0   1    4    4    5.240
# 2  21.0  6   160.0 110 3.90 2.875 17.02  0   1    4    4    5.750
# 3  22.8  4   108.0  93 3.85 2.320 18.61  1   1    4    1    4.640
# 4  21.4  6   258.0 110 3.08 3.215 19.44  1   0    3    1    6.430
# 5  18.7  8   360.0 175 3.15 3.440 17.02  0   0    3    2    6.880
# 6  18.1  6   225.0 105 2.76 3.460 20.22  1   0    3    1    6.920 
... 

但是,我想以字符串形式提供表达式,因此我必须使用以下函数调用:

f(mtcars,'wt+wt')
#    mpg   cyl disp  hp  drat wt    qsec   vs  am   gear carb answer
# 1  21.0  6   160.0 110 3.90 2.620 16.46  0   1    4    4    wt+wt
# 2  21.0  6   160.0 110 3.90 2.875 17.02  0   1    4    4    wt+wt
# 3  22.8  4   108.0  93 3.85 2.320 18.61  1   1    4    1    wt+wt
# 4  21.4  6   258.0 110 3.08 3.215 19.44  1   0    3    1    wt+wt
# 5  18.7  8   360.0 175 3.15 3.440 17.02  0   0    3    2    wt+wt
...

如何使它(更改函数定义或函数调用)以获得我想要的结果?

我尝试过的事情:

  • 我尝试过sym(string_expression)-没用。

  • 我已经尝试过(string_expression)-没用。

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以将f函数更改为以下内容:

f<-function(df,string_expression){
mutate(df, answer = eval(parse(text = string_expression)))
}

head(f(mtcars,'wt+wt'))
   mpg cyl disp  hp drat    wt  qsec vs am gear carb answer
1 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4   5.24
2 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4   5.75
3 22.8   4  108  93 3.85 2.320 18.61  1  1    4    1   4.64
4 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1   6.43
5 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2   6.88
6 18.1   6  225 105 2.76 3.460 20.22  1  0    3    1   6.92