Tidyverse中选择助手管道传across()触发警告而直接传入无提示的原因问询
问题解答
差异产生的原因
核心差异来自两种写法中选择助手的求值时机和环境不同:
- 直接将
matches("var")写在across()参数内时,R的惰性求值机制会让matches("var")留在across()的内部上下文里才执行求值,tidyselect的选择逻辑可以识别这是内置的选择助手表达式,直接在当前数据的列名环境下完成匹配,不会判定为外部对象。 - 通过管道
matches("var") %>% across(self)传值时,%>%会先对左侧的matches("var")完成求值,再将结果作为参数传入across()。此时across()收到的已经是选择助手执行完返回的列名/索引向量,对于tidyselect来说,这个传入值属于来自外部环境的对象,无法确定你是要选择匹配该值的列还是选择同名的列,因此触发歧义提示。
该表现是预期设计还是bug?
这是tidyselect组件的预期设计,并非bug。该提示的目的是避免用户误将外部环境的变量传入选择上下文导致非预期的列选择,要求用户通过all_of()/any_of()明确声明选择逻辑,降低代码出错概率。
如果需要保留管道写法同时消除提示,可以调整为如下写法:
dtemp %>% mutate(matches("var") %>% across(all_of(.), self))
内容的提问来源于stack exchange,提问作者randy
相关产品推荐
相关产品推荐

