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
相关产品推荐
相关产品推荐

