查看原文
其他

可能只是一个函数,却要耗费你大半天

jimmy 生信技能树 2022-06-06

相信很多人都有这样的体会吧,为了一件小事,耽搁了大半天功夫


——你的努力不会白费

好像不少人问过我一个聚类后的树如何根据肉眼观察到的cluster情况来提前指定的树的子集,有点类似于WGCNA分析把几千个基因划分成若干个module后能提取各个module的基因集合。
比如,在R里面输入: plot(hclust(dist(mtcars))) 会出图如下:

如果想提取中间的一个子集,不知道有cutree函数的就会纠结半天,但是知道的,就下面几句话而已。

hc=hclust(dist(mtcars))

g=cutree(hc,3)

table(g)

黑魔法
统计了近期的近百份咨询email,发现R里面的黑魔法被提及的频率非常高。
特意开辟这个黑魔法合集。
我抛砖引玉吧。

首先是在R里面把变量write.table之后竟然不一定能read.table,尤其需要注意一些参数:

quote = F,row.names =F 参考:http://www.biotrainee.com/thread-1042-1-1.html


然后是:缺失一些元素的矩阵读取报错,需要在read.table里面加上fill=TRUE

参考:http://www.biotrainee.com/thread-703-1-1.html


还有,读取带引号的文件,比如某一些KEGG通路名字里面有引号,其余的却没有。
最后,文件读取进来R里面经常就变成factor了,需要加上参数避免这一件事。

最后,所有的错误,都可以通过调试来找到的,希望你们多折腾
http://www.biotrainee.com/thread-778-1-1.html

其他优秀跟帖

用pheatmap画图热图的时候不需要前面加png或pdf这类的函数创建画板,在pheatmap里面本身就有了,只需要直接在pheatmap里面定义出图的格式就能直接有了。不然就会多出一张白图。


R读入数据时表头被添加X,check.names搞定
read.csv("filename.csv",check.names=FALSE)


在一个大loop中每次都call函数,如果在某次迭代中出现报错,会非常DT(比如跑logistic regression出现无法converge的情况)。
那么我们怎么样让大循环不被某次迭代的函数error打断呢?
你可以在循环中不直接call function,而用try去call。
例如:
for (i in 1:10000) {
   model <- try(lm(...), silent = T)
   if (class(model) != 'try-error') {.... #函数没有报错的操作} else {... #函数报错的操作}
   }

终极经验

学习R语言,报错是必然的,R里面的黑魔法早已经被各种吐槽了,不过不怕,只需要记住3个函数即可!


你head一下出错的地方的变量,看看里面的数据是不是你想象的那样!
然后str一下那些变量,看看那些数据是不是表面上看起来那样!
最后你help一下,看看是不是某些函数的某些参数你忽略掉了?

head,str,help 初学者把这3个函数敲一百遍,就入门了R语言!

head,str,help 初学者把这3个函数敲一百遍,就入门了R语言!

head,str,help 初学者把这3个函数敲一百遍,就入门了R语言!



欢迎长得帅的朋友点击下面的阅读原文参与回帖哈

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存