我想将函数的内容作为文本分配给变量,以便我可以在其中查找各种模式.(实际上,我想分配每个函数的内容,以查找从其他函数调用每个函数的频率,但是一旦我可以为一个函数执行它,这很容易做到).
乍一看,这似乎很容易.这就是为什么在控制台中键入一个函数名称,这意味着print.function应该告诉我如何做到这一点:
> print.function
function (x, useSource = TRUE, ...)
.Internal(print.function(x, useSource, ...))
<environment: namespace:base>
Run Code Online (Sandbox Code Playgroud)
失败.那么如果我只是将函数内容分配给变量并将它们强制转换为字符呢?
fxn_names <- apropos(".+")
fxns <- lapply(fxn_names,get)
as.character(fxns[[1]])
Error in as.character(fxns[[1]]) :
cannot coerce type 'builtin' to vector of type 'character'
Run Code Online (Sandbox Code Playgroud)
这里有诀窍吗?也许是一个我不了解的内部功能?
deparse?
> deparse(mean)
[1] "function (x, ...) " "UseMethod(\"mean\")"
> deparse(`+`)
[1] ".Primitive(\"+\")"
Run Code Online (Sandbox Code Playgroud)
至于将所有功能作为文本,一些技巧是必要的:
fxn_names <- apropos(".+")
fxns<-lapply(fxn_names,
function(f) eval(parse(text=paste("deparse(`", f, "`)", sep=""))))
Run Code Online (Sandbox Code Playgroud)
更新
这是更简单的解决方案(感谢@ gsk3)
fxn_names <- apropos(".+")
fxns <- lapply(fxn_names, function(x)deparse(get(x)))
Run Code Online (Sandbox Code Playgroud)