为何无命名空间冲突时仍需使用dplyr::filter?
为什么R官方文档在无命名空间冲突时也用
dplyr::filter这类语法? 你已经知道当函数名(比如filter)出现命名空间冲突时,用包名::函数名的语法可以明确指定调用哪个包的函数。但像gt官方文档里的这段代码,明明没有明显的命名冲突,却依然用了dplyr::filter、dplyr::select、glue::glue这类写法:
library(gt) # Define the start and end dates for the data range start_date <- "2010-06-07" end_date <- "2010-06-14" # Create a gt table based on preprocessed # `sp500` table data sp500 |> dplyr::filter(date >= start_date & date <= end_date) |> dplyr::select(-adj_close) |> gt() |> tab_header( title = "S&P 500", subtitle = glue::glue("{start_date} to {end_date}") ) |> fmt_currency() |> fmt_date(columns = date, date_style = "wd_m_day_year") |> fmt_number(columns = volume, suffixing = TRUE)
这种写法主要有几个原因:
- 提升代码可读性:看到
dplyr::filter,读者不用去翻代码开头的library列表,也不用猜这个函数来自哪个包,一眼就能明确函数的归属,尤其是对新手或者不熟悉所有R包函数的人来说,能快速理解代码用到的工具。 - 规避潜在的命名冲突:现在没冲突不代表以后没有。比如R的
stats包也有一个filter函数,用来做时间序列过滤,如果后续加载了这个包,直接写filter就会调用到错误的函数。提前用::语法,能让代码在任何环境下都稳定运行,不会因为后续加载其他包而出错。 - 起到示范作用:官方文档面向的是所有用户,包括新手。用全限定名能引导用户养成更严谨的编码习惯,减少因为命名冲突踩坑的概率,同时清晰展示代码依赖的各个包,方便读者去对应包的文档里查找更多细节。
- 不受包加载顺序影响:如果加载多个包,函数的调用优先级会随加载顺序变化。比如先加载
dplyr再加载stats,和反过来,直接写filter会调用不同的函数。用::语法就能完全摆脱这种影响,让代码行为始终一致。
内容的提问来源于stack exchange,提问作者Daniel Tan
相关产品推荐
相关产品推荐

