【问题标题】:Transform string of expression into quotable expression将表达式字符串转换为可引用的表达式
【发布时间】:2019-06-05 02:02:13
【问题描述】:

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

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

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) -- 没用。

  • 我试过 quo(string_expression) -- 没用。

谢谢!

【问题讨论】:

    标签: r rlang tidyeval


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-12
      • 2012-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多