R语言中summarise函数内圆点(.)的含义及代码报错原因咨询
关于dplyr中summarise内圆点(.)的疑问与解答
问题场景
我尝试用dplyr给数据框df添加行总计,以下代码可以正常运行:
可正常运行的代码
library(tidyverse) df <- df %>% bind_rows(summarise(., across(where(is.numeric), sum), across(where(is.character), ~'Total')))
但当我去掉summarise内的圆点(.)后,代码报错:
报错的代码及错误信息
df <- df %>% bind_rows(summarise(across(where(is.numeric), sum), across(where(is.character), ~'Total'))) # Error: `across()` must only be used inside dplyr verbs.
核心疑问
summarise内的圆点(.)指代什么?为何必须添加它才能正常运行?我猜测它指代df,但df已通过df %>%被隐含传递,现有资料没有解答这个问题。
解答
圆点(.)的含义:
这里的.指代的是通过管道符%>%传递给bind_rows()的前序数据框df。必须添加的原因:
管道符%>%的默认规则是把左侧对象传递给右侧函数的第一个参数。在你的代码里,bind_rows()的第一个参数就是管道传过来的df,而summarise()是作为bind_rows()的第二个参数存在的——管道不会自动把df传递给summarise(),所以summarise()默认找不到要处理的数据对象。
当你在summarise()里加上.,就是显式告诉它:要处理的数据是管道传过来的df。如果去掉.,summarise()没有明确的操作对象,相当于空执行,而across()必须依附于有明确目标数据框的dplyr动词才能工作,因此就会抛出报错。
简单来说:管道把df传给了bind_rows(),但不会自动传给bind_rows()内部的summarise(),必须用.显式引用,让summarise()知道要对哪个数据做汇总计算。
内容的提问来源于stack exchange,提问作者Nemo
相关产品推荐
相关产品推荐

