查找包含 R 函数定义的源文件
Find the source file containing R function definition
我来自 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"
深入研究其中一个已加载函数的 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"
我知道这在几年前就已经解决了,但我刚刚遇到它并意识到如果您使用 body()
函数,还有更多的东西。
原始函数只有一个属性,"srcref"
,它包含函数的代码,以及它自己的属性和 "srcref"
的 class(它决定了它如何'会打印出来的)。
一个函数的body()
,比如body(util.add)
有三个属性。
"srcref"
其中包含存储为表达式列表的函数体。
"srcfile"
其中包含函数的源文件(这就是您在本题中要查找的内容)
"wholeSrcref"
指向整个源文件。
这为您提供了一种提取源文件名 attr(body(util.add),"srcfile")
的替代方法(尽管速度稍慢),并且能够看到(尽管无法与之交互)同级 函数(即在同一源文件中加载的其他函数)。
不确定它是否有用,但它可能很有趣。
我们也不要忘记使用 {purrr}
包访问属性的 %@%
中缀运算符,有了这个我们可以使用更简洁(虽然同样更慢)的代码片段:
util.add%@%srcref%@%srcfile
我来自 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"
深入研究其中一个已加载函数的 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"
我知道这在几年前就已经解决了,但我刚刚遇到它并意识到如果您使用 body()
函数,还有更多的东西。
原始函数只有一个属性,"srcref"
,它包含函数的代码,以及它自己的属性和 "srcref"
的 class(它决定了它如何'会打印出来的)。
一个函数的body()
,比如body(util.add)
有三个属性。
"srcref"
其中包含存储为表达式列表的函数体。"srcfile"
其中包含函数的源文件(这就是您在本题中要查找的内容)"wholeSrcref"
指向整个源文件。
这为您提供了一种提取源文件名 attr(body(util.add),"srcfile")
的替代方法(尽管速度稍慢),并且能够看到(尽管无法与之交互)同级 函数(即在同一源文件中加载的其他函数)。
不确定它是否有用,但它可能很有趣。
我们也不要忘记使用 {purrr}
包访问属性的 %@%
中缀运算符,有了这个我们可以使用更简洁(虽然同样更慢)的代码片段:
util.add%@%srcref%@%srcfile