rlang:Curly-Curly运算符和RHS上字符串内的隧道数据变量

rlang:Curly-Curly运算符和RHS上字符串内的隧道数据变量,r,tidyverse,rlang,tidyeval,R,Tidyverse,Rlang,Tidyeval,我认为curly curly是bang-bang的一个很好的继承者。尽管如此,我仍在努力理解tidyverse NSE 假设我想做一个简单的函数,它在一个数据帧上运行,获取多个列,以长格式对它们进行整形,并从整形后的列中提取因子。我还希望能够定义因子级别,或者在默认情况下,将它们保留在重塑过程之前所选列的顺序中 我使用bang-bang和curly编写了相同的函数 库(tidyverse) df_试验 #>1 id1项目1 0 #>2 id1项目2 3 #>3 id1项目3 1 #>4 id1项

我认为curly curly是bang-bang的一个很好的继承者。尽管如此,我仍在努力理解tidyverse NSE

假设我想做一个简单的函数,它在一个数据帧上运行,获取多个列,以长格式对它们进行整形,并从整形后的列中提取因子。我还希望能够定义因子级别,或者在默认情况下,将它们保留在重塑过程之前所选列的顺序中

我使用bang-bang和curly编写了相同的函数

库(tidyverse)
df_试验
#>1 id1项目1 0
#>2 id1项目2 3
#>3 id1项目3 1
#>4 id1项目4 3
#>5 id1项目5 1
#>6 id2项目1 4
#>7 id2项目2
#>8 id2项目3 4
#>9 id2项目4
#>10 id2项目5不适用
#Curly-Curly的工作方式相同,但不需要环境
变量系数到长2个变量:10 x 3
#>id项值
#>      
#>1 id1项目1 0
#>2 id1项目2 3
#>3 id1项目3 1
#>4 id1项目4 3
#>5 id1项目5 1
#>6 id2项目1 4
#>7 id2项目2
#>8 id2项目3 4
#>9 id2项目4
#>10 id2项目5不适用
由(v0.3.0)于2021-02-05创建

这很有效,但我发现数据变量可以通过使用类似于
glue
的语法在带有curly-curly的字符串中进行隧道传输。例如:

#Curly-Curly-使用类似胶水的语法在字符串中挖掘数据变量
平均百分比
分组依据({{by}})%>%
总结({{vars}}):=mean({{vars},na.rm=TRUE))
}
平均值(df_测试,id,第1项)
#>#tibble:2x2
#>id项目1
#>    
#>1 ID10
#>2 id2 4
平均值(df_测试,id,第1项:第2项)
#>#tibble:2x2
#>id`item1:item2`
#>            
#>1 ID11.5
#>2 id2 3
由(v0.3.0)于2021-02-05创建

有没有一种方法可以通过隧道将数据变量名(如第二个示例)用作第一个示例中函数的因子级别?我怀疑如果提供了多个列,这种隧道可能会有问题,但是,如何将至少一个列名隧道到RHS

关于这个新的rlang主题的任何讨论都会帮助我了解更多。
谢谢。

您需要对用户选择进行隧道处理,然后在任何情况下获取名称,因此我认为您的方法很好。我会使用dplyr而不是低级的tidyselect来简化它:

vars_factor_to_long2 <- function(data, vars) {
  vars <- names(dplyr::select(data, {{ vars }}))

  data %>%
    tidyr::pivot_longer(
      cols = all_of(vars),
      names_to = "item",
      values_to = "value"
    ) %>%
    dplyr::mutate(
      item = factor(item, levels = vars)
    )
}
vars_factor_to_long2%
dplyr::突变(
项目=系数(项目,级别=变量)
)
}