有些包卸载了就回不去了
最近接收到粉丝的求助,说她安装一个包data.table
失败了,提示她R包data.table
依赖于最新的4.0以上,所以被迫升级了R,结果仍然是搞不定它,又降级为3.6,折腾了三天三夜,仍然是折戟沉沙在包data.table
上面。
我觉得她的故事非常典型,值得分享,很多人缺乏“透过现象看本质”的能力,总是会被各种各样的R报错的表面信息给误导。
我们首先回顾一下她遇到的报错:
第一个报错,pkg-config
确实是超级的诡异,因为粉丝的mac电脑里面有pkg-config,也有zlib,都是brew安装好了的。我跟她调试了十几分钟,也确认了这一点:她mac电脑里面有pkg-config,也有zlib。(PS:起初没有意识到她安装一个data.table
包的代码如此复杂,肯定是中间经历了各种各样的搜索,被带歪了)
初步怀疑是默认安装的data.table
包版本太高了,所以找到旧版本R包给她,但是接下来的报错更诡异:
完全看不懂的报错
关键是,同样的代码,我自己的mac电脑运行起来没有错!如下所示:
我可以安装
调试了半个小时,我也放弃了,主要是远程沟通很费劲,看不到电脑,我珍藏的很多花式解决bug的技能没办法施展开。我完全搞不懂她为什么就遇到了这么稀奇古怪的错误,关键是我自己的mac根本就没有pkg-config这个东西,安装包也丝毫不费劲啊!
bug掉我头上了
这件事本来就这样过去了,因为毕竟不是自己的电脑报错,但是下午我自己想用这个data.table
包的时候,就发现,居然给自己挖了一个坑。虽然说我前面安装成功了,但是加载居然会报错!
也就是说,接下来我自己的data.table
包也被搞坏了,真是尴尬啊。而且,我终于想通了为什么粉丝会误以为她自己的R需要升级到4.0了,因为报错里面的确有一个警告,说这个包是4.0条件下创造的。就是我前面提到的,她被表面信息给蒙蔽了。
现在,这个报错是我自己的事情了,不得不解决了。首先我尝试重新安装它,继续报错:
报错之一
完美重现了粉丝的报错,哈哈哈!确实,我的电脑没有pkg-config,也有zlib,但是我稍微思考了一下,如果我继续沿着这个思路去解决pkg-config和zlib,其实就是走了粉丝的老路,是不可能去真正解决这个data.table
包的问题。
而且,报错信息实在是太多了,很容易让人迷失在里面,抓不住重点。
报错之二
这些报错非常具有迷惑性,所以我重新安装data.table
。
有意思的是,这一次我选择no,居然就成功了。
选择不编译
后记
说不清楚我是如何解决这个无缘无故掉落在我头上的bug的,也许是运气?
- Spring Cloud各组件超时总结
- 总结Web应用中常用的各种Cache
- 碎片化 | 第四阶段-50-hibernate之Criteria和NavtiveSQL查询操作-视频
- kafka_2.11-0.11.0.1集群搭建
- Spring Cloud Edgware新特性之五:filters端点
- 碎片化 | 第四阶段-51-Hibernate注解使用-视频
- 基础JavaScript装逼指南
- 碎片化 | 第四阶段-42-校验验证码-视频
- Angularjs中UI Router超级详细的教程{{上}}
- 【LEETCODE】模拟面试-120- Triangle
- Spring Cloud Edgware新特性之四:Zuul routes端点功能增强
- Spring Cloud Edgware新特性之三:使用配置属性自定义Feign的行为
- 碎片化 | 第四阶段-43-struts2拦截器interceptor-视频
- Spring Cloud Edgware新特性之二:如何配置Zuul的Hystrix线程池
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法