R问题|如何查看函数的源代码

简介: R问题|如何查看函数的源代码

简介

最近有读者问我,如何查看R语言某包中某函数的源代码呢?我第一时间给出了自己比较常用的方法(见方法一),今天打算做个这方面的推文,于是又查了些资料,才发现原来水好深!还有更好的方法(见方法二),并且和不同的面向对象系统有关。

方法一


打开查 R 包的相关网站,比如:https://rdrr.io/

查R包的相关网站

  1. 输入你的 R 包名称或者相应的函数,这里以 nlme 包中的 lme()为例。

找到对应位置

  1. 进入会出现这样的界面,界面相应介绍可以下图:

界面介绍

  1. 打开左上角的源代码(Source code)即可找到该包内部的所有函数了。

源代码

  1. 找到你对应的函数,进入即可,任务完成。

nlme 源代码

方法二

Stack overflow[1]中给出了一些更加高效的方式,在 R 控制台输入相应函数,即可得到对应函数的源代码了。

这里小编做个知识点整理,自己也学一波。这里的知识点比较难,和面向对象编程有关,就当是拓展吧,实在不行就和小编一样使用方法一吧。

S3方法调度系统

对于S3类,可以使用methods函数列出所有和该函数有关的特定泛型函数或类,例如:输入methods(t)

> methods(t)
[1] t.data.frame t.default    t.ts*       
   Non-visible functions are asterisked
> methods(class="ts")
 [1] aggregate.ts     as.data.frame.ts cbind.ts*        cycle.ts*       
 [5] diffinv.ts*      diff.ts          kernapply.ts*    lines.ts        
 [9] monthplot.ts*    na.omit.ts*      Ops.ts*          plot.ts         
[13] print.ts         time.ts*         [<-.ts*          [.ts*           
[17] t.ts*            window<-.ts*     window.ts*      
   Non-visible functions are asterisked

“Non-visible functions are asterisked”表示该函数未从其程序包的命名空间中导出。但你可以通过:::函数(即stats :::: t.ts)或使用getAnywhere()查看其源代码。

注:getAnywhere()非常好用,你不需要知道函数来自哪个包。推荐直接使用这个函数。

> getAnywhere(t.ts)
A single object matching ‘t.ts’ was found
It was found in the following places
  registered S3 method for t from namespace stats
  namespace:stats
with value
function (x) 
{
    cl <- oldClass(x)
    other <- !(cl %in% c("ts", "mts"))
    class(x) <- if (any(other)) 
        cl[other]
    attr(x, "tsp") <- NULL
    t(x)
}
<bytecode: 0x294e410>
<environment: namespace:stats>

S4方法的调度系统

S4系统是一种较新的方法调度系统,可以替代S3系统。下面是一个S4函数的示例

> library(Matrix)
Loading required package: lattice
> chol2inv
standardGeneric for "chol2inv" defined from package "base"
function (x, ...) 
standardGeneric("chol2inv")
<bytecode: 0x000000000eafd790>
<environment: 0x000000000eb06f10>
Methods may be defined for arguments: x
Use  showMethods("chol2inv")  for currently available ones.

输出已经提供了很多信息。standardGeneric是S4函数的指示器。使用showMethods可以查看已定义的S4的方法

> showMethods(chol2inv)
Function: chol2inv (package base)
x="ANY"
x="CHMfactor"
x="denseMatrix"
x="diagonalMatrix"
x="dtrMatrix"
x="sparseMatrix"

getMethod可以用来查看其中一个方法的源代码

> getMethod("chol2inv", "diagonalMatrix")
Method Definition:
function (x, ...) 
{
    chk.s(...)
    tcrossprod(solve(x))
}
<bytecode: 0x000000000ea2cc70>
<environment: namespace:Matrix>
Signatures:
        x               
target  "diagonalMatrix"
defined "diagonalMatrix"

调用未导出函数的函数

对于ts.union.cbindts.makeNamesTs是stats名称空间中未导出的函数。您可以使用:::运算符或getAnywhere查看未导出函数的源代码。

> stats:::.makeNamesTs
function (...) 
{
    l <- as.list(substitute(list(...)))[-1L]
    nm <- names(l)
    fixup <- if (is.null(nm)) 
        seq_along(l)
    else nm == ""
    dep <- sapply(l[fixup], function(x) deparse(x)[1L])
    if (is.null(nm)) 
        return(dep)
    if (any(fixup)) 
        nm[fixup] <- dep
    nm
}
<bytecode: 0x38140d0>
<environment: namespace:stats>

小编有话说

  • 其实找代码简单,有些源代码是比较简单易懂的。但是更多的是通过面向对象编程的,以小编现在的能力还是看不大懂的。对于R初学者来说,要看懂源代码却是比较困难。
  • 关于R语言高级编程学习,可以参考哈德利·威克汉姆开源书籍:Advanced R[2]链接在文末的参考资料中),以及机械工业出版社出了对应的中文翻译版本《高级R语言编程指南》
  • 好消息,题外话: 在导师的帮助下,小编硕士期间第一篇sci终于接受了。运气不错,投的期刊今年升为一区顶刊了。天上乌云散开了,擦擦汗水,背起行囊,继续前行。

参考资料

[1]

Stack overflow: https://stackoverflow.com/questions/19226816/how-can-i-view-the-source-code-for-a-function

[2]

Advanced R: https://adv-r.hadley.nz/

目录
相关文章
|
编译器 C++ 开发者
【C/ C++链接】深入C/C++链接:从基础到高级应用(一)
【C/ C++链接】深入C/C++链接:从基础到高级应用
338 0
|
编解码 算法 数据挖掘
【数据挖掘】聚类趋势估计、簇数确定、质量测定等评估方法详解(图文解释 超详细)
【数据挖掘】聚类趋势估计、簇数确定、质量测定等评估方法详解(图文解释 超详细)
418 0
|
7月前
|
机器学习/深度学习 自然语言处理 小程序
MiniMax开源超长文本处理神器,魔搭社区助力开发者推理部署
Transfermor架构与生俱来的二次计算复杂度,及其所带来的上下文窗口瓶颈,一直为业界所关注。此前,MiniMax开源了MiniMax-01系列模型,采用创新的线性注意力架构,使得模型能够在100万个token长度的上下文窗口上进行预训练;而在推理时,实现了高效处理全球最长400万token的上下文,是目前最长上下文窗口的20倍。
369 0
|
存储 编解码 数据可视化
Visium HD空间数据分析、可视化以及整合 (2)
Visium HD空间数据分析、可视化以及整合 (2)
Visium HD空间数据分析、可视化以及整合 (2)
|
机器学习/深度学习 算法 机器人
【博士每天一篇文献-算法】改进的PNN架构Lifelong learning with dynamically expandable networks
本文介绍了一种名为Dynamically Expandable Network(DEN)的深度神经网络架构,它能够在学习新任务的同时保持对旧任务的记忆,并通过动态扩展网络容量和选择性重训练机制,有效防止语义漂移,实现终身学习。
228 9
|
机器学习/深度学习 人工智能 分布式计算
因果推断:效应估计的常用方法及工具变量讨论
日常工作中很多的策略/产品的效果是无法设计完美的随机实验的,要求我们从观察性数据中去(拟合随机试验)发现因果关系、测算因果效应。
2427 0
因果推断:效应估计的常用方法及工具变量讨论
|
存储 算法 PyTorch
pytorch 给定概率分布的张量,如何利用这个概率进行重复\不重复采样?
在 PyTorch 中,可以使用 torch.distributions.Categorical 来基于给定的概率分布进行采样。
1251 0
|
机器学习/深度学习 算法 数据可视化
探索Python中的聚类算法:层次聚类
探索Python中的聚类算法:层次聚类
207 0
|
Java 关系型数据库 MySQL
Spring Boot使用JdbcTemplate操作mysql数据库实战(附源码 超详细)
Spring Boot使用JdbcTemplate操作mysql数据库实战(附源码 超详细)
629 0
|
Java 编译器 Go
终于弄懂Go语言变量逃逸分析 新手不能错过这篇指南
终于弄懂Go语言变量逃逸分析 新手不能错过这篇指南
375 0