dplyr管道中"."符号无法像以往正常工作的原因排查
问题原因与解决方案
你的代码报错是因为R原生管道|>和magrittr管道%>%对.的处理逻辑完全不同:
- 之前代码能正常运行时,你用的应该是magrittr的
%>%管道,它允许用.显式指代管道左侧的输入,比如bind_rows(., test)就是把左侧数据框作为第一个参数传入,test作为第二个参数。 - 现在代码里用的是R原生的
|>管道,它的.只有在把左侧输入作为非第一个参数时才有用。如果在第一个参数位置写.,原生管道不会自动把左侧输入赋值给.,反而会把.当成未定义的变量,所以会报"."未找到的错误。
两种解决办法
办法1:换回magrittr管道(保留.写法)
如果你想继续用原来的.语法,只需要把|>换成%>%,确保已经加载tidyverse或magrittr包:
library(tidyverse) test <- iris %>% select(Sepal.Length, Sepal.Width) random <- data.frame( Sepal.Length = sample(iris$Sepal.Length), Sepal.Width = sample(iris$Sepal.Width)) %>% bind_rows(., test) %>% ggplot(aes(x=Sepal.Length, y=Sepal.Width)) + geom_point()
办法2:适配原生管道写法
原生管道默认把左侧输入作为函数的第一个参数,所以直接传入第二个参数即可,不需要写.:
test <- iris |> select(Sepal.Length, Sepal.Width) random <- data.frame( Sepal.Length = sample(iris$Sepal.Length), Sepal.Width = sample(iris$Sepal.Width)) |> bind_rows(test) |> ggplot(aes(x=Sepal.Length, y=Sepal.Width)) + geom_point()
额外说明
如果在原生管道中需要把左侧输入作为非第一个参数,才需要用到.,比如:
# 示例:计算Sepal.Length的均值并作为新列 iris |> mutate(new_col = mean(.$Sepal.Length))
内容的提问来源于stack exchange,提问作者Fabio Favoretto
相关产品推荐
相关产品推荐

