R中加载sets包后dplyr等函数运行报错:仅对全数值数据框定义
问题原因
这是R包命名空间冲突导致的异常:sets包加载时会覆盖dplyr定义的管道运算符%>%,哪怕你显式指定调用dplyr::mutate,实际传入函数的管道已经是sets包的版本,该版本的管道默认会对数据做全数值校验,才会抛出only defined on a data frame with all numeric variables的错误提示。janitor相关函数异常也是同理,其内部依赖dplyr的管道/函数逻辑,被sets覆盖后也会触发执行错误。
解决方案
- 调整包加载顺序:优先加载
sets包,再加载dplyr包,后加载的包会覆盖同名的导出函数,管道就会默认用dplyr的版本,直接修改你的复现代码加载顺序即可正常运行:
# 调整加载顺序后的可运行示例 remove.packages(c("dplyr", "sets")) install.packages(c("dplyr", "sets")) library(sets) library(dplyr) name <- c("Jon", "Bill", "Maria") age <- c(23, 41, 32) df <- data.frame(name, age) data_2 <- df %>% dplyr::mutate(test = "test")
- 显式指定管道来源:如果必须先加载
dplyr再加载sets,可以全限定名调用dplyr的管道,避免走sets的管道逻辑:
data_2 <- dplyr::`%>%`(df, dplyr::mutate(test = "test"))
- 全局配置冲突规则:安装加载
conflicted包,显式声明常用函数的默认来源,避免后续其他包也出现同类静默覆盖问题:
install.packages("conflicted") library(conflicted) # 声明%>%和mutate默认用dplyr的版本 conflict_prefer("%>%", "dplyr") conflict_prefer("mutate", "dplyr")
内容的提问来源于stack exchange,提问作者Isabella Bingaman
相关产品推荐
相关产品推荐

