1. 背景
R作图过程中,反复确认源代码已无误的前提下,代码运行到filter()函数时出现错误:
Error in class == “subcompact” : comparison (==) is possible only for atomic and list types。
2. 原因分析
确认不是源代码的问题,所以觉得可能就是R包的问题。于是重新加载作图所需的两个R包:
library(ggplot2)
library(tidyverse)
ggplot2加载无误,但加载tidyverse时提示Conflicts冲突。
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
什么意思呢?tidyverse的核心包dplyr所使用的filter()函数被stats包的filter()覆盖!那又是什么意思?就是我画图时用的filter()不是我真正需要的filter()!披着羊皮的狼!又为什么会这样?原来不同的R包来源于不同的开发者,他们不会约定俗成地为不同功能的函数取不同的名字,因而包和包之间就会产生具有不同功能的同一名字的函数。而R包的加载是有顺序的,同名函数中后面加载的必定会覆盖前面加载的,导致代码运行时,默认调用后面加载的,就可能会导致出错,尤其是导致源代码准确无误而运行总是出错。原因找到,那怎么解决呢?
3. 解决办法
解决的办法很简单,"包::函数"的形式跟R解释器指明你要调用的函数就行了,如我要调用的是dplyr中的filter():
dplyr::filter()
运行后会出现关于dplyr::filter()的信息:
4. 结果
调用之后再次运行源代码,不再有出错提示,运行成功:
另附代码结果图: