找到包含R函数定义的源文件

时间:2015-09-23 18:49:10

标签: r metaprogramming

我来自python背景,我正试图加快R的速度,所以请耐心等待我

我有一个R文件 - util.R,其中包含以下行:

util.add <- function(a,b) a + b
util.sub <- function(a,b) { a - b }

我的来源如下:

source('path/util.R')

我现在有两个函数对象,想要编写一个函数,如下所示:

  

getFilePath(util.add)

会给我这个结果

[1] "path/util.R"

2 个答案:

答案 0 :(得分:8)

如果你够深入,那么深入了解其中一个已加载函数的srcref属性似乎有效......

source("tmp/tmpsrc.R")
str(util.add)
## function (a, b)  
##  - attr(*, "srcref")=Class 'srcref'  atomic [1:8] 1 13 1 31 13 31 1 1
##   .. ..- attr(*, "srcfile")=Classes 'srcfilecopy', 'srcfile' <environment: 0x8fffb18> 
srcfile <- attr(attr(util.add,"srcref"),"srcfile")
ls(srcfile)
## [1] "Enc"           "filename"      "fixedNewlines" "isFile"       
## [5] "lines"         "parseData"     "timestamp"     "wd"    
srcfile$filename
## [1] "tmp/tmpsrc.R"

答案 1 :(得分:1)

我知道这个问题是在几年前解决的,但是我刚刚发现它,并且意识到如果使用body()函数,还有很多其他事情。

raw函数只有一个属性"srcref",其中包含函数的代码,以及它自己的属性和"srcref"的类(指示如何打印)。 / p>

函数body()的{​​{1}}具有三个属性。

  • body(util.add),其中包含存储为表达式列表的函数主体。
  • "srcref",其中包含函数的源文件(这是您在本问题中要查找的内容)
  • "srcfile"指向整个源文件。

这为您提供了一种替代方法(尽管速度稍慢)来提取源文件名"wholeSrcref",并且能够查看(尽管不与之交互)兄弟函数(即其他功能加载到同一源文件中。

不确定它是否有用,但是可能很有趣。

我们也不要忘记使用attr(body(util.add),"srcfile")包访问属性%@%的infix运算符,这样,我们可以使用更简洁(尽管速度更慢)的代码段: {purrr}