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}})
}