原创 双鸭山科研小黑屋 双鸭山科研小黑屋 2022-05-05 19:00
作者:小黑屋某菜鸡
开始前一定要讲明白菜鸡的概念:所有的bug都来源于个人的脑残行为,所有debug的延后,都来源于对自己不清晰的认知:
接下来小黑屋某菜鸡用个人亲身经验传授如何避免天天干蠢事👇(所以这篇又叫做:别一天天净干蠢事,做个人吧!)
事情是这样子的
在一个月黑风高的夜晚,小黑屋某菜鸡的数据需要进行倾向性匹配分析,需要用R语言来跑代码。菜鸡在遍布网络教程之后,精心选择了Matchlt这个R包。
在第一次使用某R包时,你需要先下载它。菜鸡哒哒两下,自信地打下回车键:
“Not Available”?难道这个R包过期了?菜鸡半信半疑地打开了这个包的使用手册:
难道是我的R太过落后?
菜鸡卡壳了:那也不是呀!
这时候聪明的小朋友可能已经发现了华点:有没有可能是名字打错了?毕竟在等线体中大写的i和小写的L是一模一样的呀!
菜鸡当然没有想到这个浅而易见的错误,但Ta在盲目地刷着使用说明时,
突然看到了如下的标志:
人家不已经给你用非等线体标出来:这是个I(Ai)吗!
小黑屋某菜鸟哭唧唧地把L换成i,然后发现代码如丝般顺滑地跑下去了,深刻觉悟菜鸡的痛苦在如此细微之处。
可能聪明的小朋友以为,菜鸡会吃一堑,长一智。
但在几天后,小黑屋某菜鸡又又又遇到一个bug,需要对建立好的模型进行predict计算。
结果显示没有找到change这个变量。
因为代码中没有指定数据集的来源,所以菜鸡就认为这个是报错的原因,在change前面标注出来数据集的来源。
也报错了!菜鸡又想了想,因为这个调用的是模型的变量,所以前面的标注应该是模型的来源,菜鸡又把change前面的数据来源调整了一下。
咦!这次倒是没有报错,但是为什么数据类型是一连串的数值?
按照预期的结果应该是一个数据框,采取其中的数值进行后期的运算。
菜鸡百思不得其解,最后没办法之下只能再次盲目地刷着使用说明,最后灵机一动,难道我大小写写错了?
换了Predict后,虽然没有标明change的数据来源,但代码没有报错,也得到预期的结果。
原来Predict是rms的内部函数,调用rms函数来计算预测值,全称其实应该是rms::Predict。
而predict是r的内置函数,根据后期的设定进行模型预测值计算。
真相大白,简单的字母大小写却代表了不同的R代码逻辑。
其实每个R语言工作人都需要经过这个低级的Debug经历,在代码世界中,差之毫厘,谬以千里,需要对自己打的每个字母都谨慎小心,bug可能就藏于其中。
在最后菜鸡总结一下自己初学R语言的一些Debug心得
1、R本身会提示错误,没有error就意味着成功的到来。
2、在升级R版本后,记得把R包的版本也升级一下,避免不必要的时间浪费在各种error上面,最后却发现是版本不适配。
3、在实用新的R包之前,可以先把R包的使用说明,标重点,示范案例看清楚,直接复制说明上的代码进行修改,可以避免很多拼写错误。
4、再三确认代码没错后,反复看自己的数据,代码没错就一定是数据错误,可能是变量的格式,也可能是表格的形式,曾经多重插补一直失败,考虑是id编码干扰了插补的底层计算逻辑,删除id编码后果然成功了。
5、如果看不懂error的提示,复制黏贴百度、google及万能GitHub,Internet会帮助你的。
6、有时候反复思考都找不到bug,可以先睡一觉转换思考角度,或者发给万能的师兄看一看, bug自然浮现。
祝大家的所有代码都可以如丝般顺滑,never warning,never error。
如有侵权,请联系本站删除!