104-R茶话会19-几种查看函数源代码的方法

  • 参考:
    • 六种方法查看R函数源代码,为啥第三种最惹人喜欢?- 简书 (jianshu.com)[1]

前言

最近正好在探索[[管中窥rpca(ReciprocalProject)]] 函数以及seurat 家族里其他函数的用法,借此机会来总结一下。

1-直接查看

其实非常粗暴,比如我想知道Seurat 中的某个方法,直接去掉这个函数对应的括号和参数即可(如果加载这个包到环境中,也可以直接通过函数名获取):

代码语言:javascript
复制
> Seurat::DimHeatmap

我可以直接输出到console 中。这里就并不展示了。之前我们说过,因为有的函数作者并没有写出给用户调用,这时候如果使用的话:

代码语言:javascript
复制
> Seurat::AnnoyNN
错误: 'AnnoyNN'不是'namespace:Seurat'内的出口对象:

这时候就需要使用:::了:

代码语言:javascript
复制
> Seurat:::AnnoyNN

当然直接输出到console 太过原始,不便于我们去了解代码。

这里还可以利用sink 函数将输出的内容输出到指定的文件中,亦或是:

还可以在Rstudio 中通过F2 快捷键查看:

还可以用函数edit()。会自动调出一个编辑窗口,可以直接编辑函数并将结果赋值给新的变量,非常适合那些需要简单修改的函数:

代码语言:javascript
复制
a <- edit(Seurat::as.CellDataSet)

2-泛型函数

在R 的面向对象中还存在一类泛型函数,这里先不展开说了。它们通常是这样:

这类函数会根据对象的不同,调用不同的函数,可以通过methods 查看:

代码语言:javascript
复制
> methods(mean)
 [1] mean,ANY-method          mean,Matrix-method      
 [3] mean,sparseMatrix-method mean,sparseVector-method
 [5] mean.Date                mean.default            
 [7] mean.difftime            mean.ecdf*              
 [9] mean.ewcdf*              mean.IDate*             
[11] mean.im*                 mean.ITime*             
[13] mean.leverage.ppm*       mean.POSIXct            
[15] mean.POSIXlt             mean.quosure*           
[17] mean.vctrs_vctr*         mean.yearmon*           
[19] mean.yearqtr*            mean.zoo*               
see '?methods' for accessing help and source code

比如我们关心的是Date 对象的除了,就可以直接通过mean.Date 查看了。

但如果是*的函数呢?

代码语言:javascript
复制
> mean.leverage.ppm*
+ 
> mean.leverage.ppm
错误: 找不到对象'mean.leverage.ppm'

R 不仅不能直接识别*,也不能删除后查看。

说明它和Seurat:::AnnoyNN,是被隐藏起来的函数,我们需要通过getAnywhere(mean.leverage.ppm) 来查看,或者spatstat.core:::mean.leverage.ppm 同理。

3-网站查看

如果是github 上的包,直接查看对应的代码,如果是上传到cran 等,同样的操作:

没有什么是直接偷家搞不定的。

其他技巧

比如我会使用sink 函数来捕获函数的输出,保存在txt 文件中便捷阅读代码。

其实这里你也可以用

参考资料

[1]

六种方法查看R函数源代码,为啥第三种最惹人喜欢?- 简书 (jianshu.com): https://www.jianshu.com/p/ae68ae6c68dd