R:使用字符串作为参数来改变dplyr中的动词

R:使用字符串作为参数来改变dplyr中的动词,r,dplyr,nse,tidyeval,R,Dplyr,Nse,Tidyeval,我正在构建一个闪亮的应用程序,它需要允许用户定义用于绘图的新变量。具体地说,我想允许用户定义一个表达式,以便在mutate动词中使用。服务器以文本形式接收表达式,我想知道如何使mutate在dplyr 0.7中执行它。我可以使用mutate_uu使它(部分)工作,但现在不推荐使用它。它还将新列名定义为整个表达式,而不是新变量 以下是一个可复制的示例: input_from_shiny <- "Petal.ratio = Petal.Length/Petal.Width" iris_muta

我正在构建一个闪亮的应用程序,它需要允许用户定义用于绘图的新变量。具体地说,我想允许用户定义一个表达式,以便在mutate动词中使用。服务器以文本形式接收表达式,我想知道如何使mutate在dplyr 0.7中执行它。我可以使用mutate_uu使它(部分)工作,但现在不推荐使用它。它还将新列名定义为整个表达式,而不是新变量

以下是一个可复制的示例:

input_from_shiny <- "Petal.ratio = Petal.Length/Petal.Width"
iris_mutated <- iris %>% mutate_(input_from_shiny)

从技术上讲,我可以使用正则表达式从字符串中提取新变量名并相应地重命名新列,但我想知道使用最新的dplyr版本(正在阅读,但无法理解)实现它的正确方法是什么(砰砰)以产生相同的结果:

  • parse_quosure
    :解析提供的字符串并将其转换为quosure

  • :取消引用一个quosure,以便可以通过
    tidyeval
    动词对其进行评估

请注意,在
rlang 0.2.0
的文档中,
parse_quore()
已被软性弃用,并重命名为
parse_quo()
。如果我们使用
parse_quo()
,我们需要指定QUOSURE的环境,例如
parse_quo(input_from,env=caller_env())

库(rlang)
图书馆(tidyverse)
输入来自光泽萼片。长萼片。宽瓣。长瓣。宽种
#>1 5.1 3.5 1.4 0.2刚毛
#>2 4.9 3.0 1.4 0.2刚毛
#>3 4.7 3.2 1.3 0.2刚毛
#>4.6 3.1 1.5 0.2刚毛
#>5.0 3.6 1.4 0.2刚毛
#>6 5.4 3.9 1.7 0.4刚毛
#>花瓣比率=花瓣长度/花瓣宽度
#> 1                                   7.00
#> 2                                   7.00
#> 3                                   6.50
#> 4                                   7.50
#> 5                                   7.00
#> 6                                   4.25
相同(iris_突变,iris_突变2)
#>[1]是的
编辑:以分离左侧和右侧

lhs包是一个简化的tidy eval接口,它试图在这样的情况下让事情变得更直截了当

将字符串一分为二,将获得希望用作列名的部分字符串和希望用作表达式的部分字符串。所以你可以写:

library(friendlyeval)
library(dplyr)
lhs <- "Petal.ratio"
rhs <- "Petal.Length/Petal.Width"

iris_mutated3 <- 
  iris %>% 
  mutate(!!treat_string_as_col(lhs) := !!treat_string_as_expr(rhs))
head(iris_mutated3)
库(friendlyeval)
图书馆(dplyr)

lhs是否有一种方法可以自动更正列名,或者唯一的方法是在以后重命名列名?您必须将列名作为一个单独的变量,或者将其解析为一个单独的变量,并使用
mutate(!!new_col:=!!parse_quosure(rest_of_expression)
@Jake:!!不是语法糖,因为UQ不是函数(并将在未来版本的rlang中消失)感谢您的澄清和提醒!删除了我以前不准确的评论。
library(friendlyeval)
library(dplyr)
lhs <- "Petal.ratio"
rhs <- "Petal.Length/Petal.Width"

iris_mutated3 <- 
  iris %>% 
  mutate(!!treat_string_as_col(lhs) := !!treat_string_as_expr(rhs))
head(iris_mutated3)