You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言中为何在rename_with的公式里传递names(.)不生效?

问题原因解析

第一行代码报错的核心原因

rename_with的第一个参数.fn是用来处理单个列名的函数,公式里的.默认指代的是每一个待处理的列名(字符串),而非管道传过来的整个iris数据框。

当你写~gsub("Petal","_",names(.))时,.是单个字符串(比如"Sepal.Length"),对字符串调用names(.)会返回NULL,gsub拿到空值自然会报错。

另外,.cols参数里的all_of(names(.))是正常的,因为.cols的上下文里,.确实指代管道传过来的整个数据框。

第二行代码正常运行的原因

这里用了~~,它的作用是让R直接执行后面的表达式,而非把.当作单个列名处理。names(iris)直接获取了数据框的所有列名,gsub能正常替换,所以代码可以运行。

更灵活的正确写法

如果不想硬写数据集名iris,可以用以下方式在.fn里引用整个数据框的列名:

# 方法1:用lambda函数额外接收数据集参数
iris %>% rename_with(function(x, df) gsub("Petal", "_", names(df)), .cols = all_of(names(.)), df = .)

# 方法2:用cur_data()获取当前上下文的数据集
iris %>% rename_with(~gsub("Petal","_",names(cur_data())), all_of(names(.)))

内容的提问来源于stack exchange,提问作者Din

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 20:25:54