R 如何将配额分配给另一个对象?

R 如何将配额分配给另一个对象?,r,rlang,quosure,R,Rlang,Quosure,我想更改某个参数的名称 接下来,我应该使用lifecycle::deprecate\u warn,然后将旧名称赋予新名称 但是,在我的函数中,参数通常与quosures一起使用,因此属性失败并出现错误: 库(tidyverse) 图书馆(生命周期) 图书馆(rlang) my_fun=函数(df,cols,.vars=deprecated()){ 如果(quo_缺失(enquo(cols))和&!quo_缺失(enquo(.vars))){ 反对“我的乐趣(.vars=)”、“我的乐趣(cols

我想更改某个参数的名称

接下来,我应该使用
lifecycle::deprecate\u warn
,然后将旧名称赋予新名称

但是,在我的函数中,参数通常与quosures一起使用,因此属性失败并出现错误:

库(tidyverse)
图书馆(生命周期)
图书馆(rlang)
my_fun=函数(df,cols,.vars=deprecated()){
如果(quo_缺失(enquo(cols))和&!quo_缺失(enquo(.vars))){
反对“我的乐趣(.vars=)”、“我的乐趣(cols=)”)
cols%头()
#>萼片长度
#> 1          5.1
#> 2          4.9
#> 3          4.7
#> 4          4.6
#> 5          5.0
#> 6          5.4
my_fun(iris,.vars=萼片长度)%>%head()
#>警告:“my_fun()”的“.vars”参数从0.1.6开始就不推荐使用。
#>请改用'cols'参数。
#>此警告每8小时显示一次。
#>调用`lifecycle::last_warnings()`查看此警告的生成位置。
#>my_fun中的错误(iris,.vars=萼片长度):对象“萼片长度”可插入
由(v0.3.0)于2021-01-28创建

我盲目地用
enquo
和其他工具尝试了各种各样的东西,但没有任何效果


如何将旧名称归属于新名称?

回想一下
{
!!enquo()
的缩写。由于您想引用
cols
.vars
,根据缺少的名称,我建议分别执行
!!
enquo()

my_fun = function(df, cols, .vars = deprecated()){
  if (quo_is_missing(enquo(cols)) && !quo_is_missing(enquo(.vars))) {
    deprecate_warn("0.1.6", "my_fun(.vars=)", "my_fun(cols=)")
    cols <- enquo(.vars)    # Quote .vars, if cols is missing
  }
  else cols <- enquo(cols)  # Quote cols, if cols is not missing

  select(df, !!cols)        # Unquote with !!, instead of {{, which is !!enquo()
}

my_fun(iris, cols=Sepal.Length) %>% head()    # Works
my_fun(iris, .vars=Sepal.Length) %>% head()   # Also works

事实上,这是我考虑过的一个解决方案但是一个内部函数需要一个quosure。它也需要一些有意义的重构来更改内部函数,所以我不想这样做。抱歉,结果是错的,我的意思是我的内部函数需要一个名称,而不是quosure。就像
dplyr::select
。抱歉,最后一行必须是
select(df{{cols}}
因此它模仿了我的函数的工作方式。你的答案很好,但它需要太多的重构。如果没有其他解决方案,我将接受它。不幸的是,
{{
对您尝试执行的操作限制太大。它捕获提供给
cols
的表达式并立即使用它。由于这两个操作之间没有间隙,因此您无法修改表达式。更改
捕获的内容的唯一方法{{
将修改调用
my_fun
的方式,可能需要借助包装器。当然,这样的包装器可能是函数本身;)请参阅我的编辑。
my_fun = function(df, cols, .vars = deprecated()){
  if (quo_is_missing(enquo(cols)) && !quo_is_missing(enquo(.vars))) {
    deprecate_warn("0.1.6", "my_fun(.vars=)", "my_fun(cols=)")
    return( my_fun(df, {{.vars}}) )   # .vars will be captured as cols
  }

  select(df, {{cols}})
}