【问题标题】:R: Collect All Function Definitions from a LibraryR:从库中收集所有函数定义
【发布时间】:2021-09-24 23:48:12
【问题描述】:

我正在使用 R。我在 stackoverflow 上找到了这篇上一篇文章,其中展示了如何获取属于给定库的所有函数的“列表”:

How to find all functions in an R package?

例如:

#load desired library
library(ParBayesianOptimization)

#find out all functions from this library
getNamespaceExports("ParBayesianOptimization")

[1] "addIterations"    "getLocalOptimums" "bayesOpt"         "getBestPars"      "changeSaveFile"   "updateGP" 

上面的代码告诉我“ParBayesianOptimization”库中使用的所有函数的名称。从这里,我可以手动检查这些功能中的每一个 - 例如:

# manually inspect any one of these functions
getAnywhere(bayesOpt)

A single object matching ‘bayesOpt’ was found
It was found in the following places
  package:ParBayesianOptimization
  namespace:ParBayesianOptimization
with value

#function stats here
function (FUN, bounds, saveFile = NULL, initGrid, initPoints = 4, 
    iters.n = 3, iters.k = 1, otherHalting = list(timeLimit = Inf, 
        minUtility = 0), acq = "ucb", kappa = 2.576, eps = 0, 
    parallel = FALSE, gsPoints = pmax(100, length(bounds)^3), 
    convThresh = 1e+08, acqThresh = 1, errorHandling = "stop", 
    plotProgress = FALSE, verbose = 1, ...) 
{
    startT <- Sys.time()
    optObj <- list() 

etc etc etc ...

saveFile = saveFile, verbose = verbose, ...)
    return(optObj)
}
#function ends here
<bytecode: 0x000001cbb4145db0>
<environment: namespace:ParBayesianOptimization>

目标:是否可以使用这些函数中的每一个并创建一个包含完整定义的记事本文件?

看起来像这样的东西:

我的尝试:

我想我可以先在 R 中创建一个“对象”,其中包含该库中的所有函数:

library(plyr)
a = getNamespaceExports("ParBayesianOptimization")
my_list = do.call("rbind.fill", lapply(a, as.data.frame))

            X[[i]]
1    addIterations
2 getLocalOptimums
3         bayesOpt
4      getBestPars
5   changeSaveFile
6         updateGP

然后,我可以手动创建一个“分配箭头”:

header_text <- rep("<-")

然后,将其“粘贴”到每个函数名称:

combined_list <- as.character(paste(my_list, header_text, sep = ""))

但这看起来不正确:

combined_list
[1] "c(\"addIterations\", \"getLocalOptimums\", \"bayesOpt\", \"getBestPars\", \"changeSaveFile\", \"updateGP\")<- "

目标是自动化手动复制/粘贴的过程:

function_1 = getAnywhere("first function ParBayesianOptimization library") 
function_2 = getAnywhere("second function ParBayesianOptimization library") 
etc

final_list = c(function_1, function_2 ...)

并从每个函数中删除通用描述:

A single object matching ‘bayesOpt’ was found
It was found in the following places
  package:ParBayesianOptimization
  namespace:ParBayesianOptimization
with value

最后,如果我要“调用”final_list 对象,则该库中的所有函数都应该重新创建和重新分配。

有人可以告诉我如何做到这一点吗? 谢谢

【问题讨论】:

  • 看看dump()函数。如果您将函数名称作为列表传递,它可以导出函数的代码。但看起来您只是在查看导出的函数,并且某些函数可能会调用未导出的函数,如果您尝试使用这些函数,这些函数会中断。如果您打开 tar.gz 包文件,您可以在“R”文件夹中获取所有 R 函数的所有源代码。我不清楚您通过重新定义所有功能到底想完成什么。
  • 感谢您的回复!我只是想获得具有特定库的每个函数的函数定义。我知道如果你调用它们,可能会有未导出的函数可能会中断 - 但作为一个学习短途旅行,我很想看看是否有一种自动方法来获取库中每个函数的代码(例如,请看截图我上传了)。非常感谢您的帮助!

标签: r list function concatenation variable-assignment


【解决方案1】:

您可以为此使用dump 函数

pkg <- "ParBayesianOptimization"
dump(getNamespaceExports(pkg), file="funs.R", envir = asNamespace(pkg))

【讨论】:

  • 这也太不可思议了!这正是我需要的方式出现在 R 环境中!我很敬畏!非常感谢!
【解决方案2】:

此代码将帮助您将库中所有函数的函数定义写入文本文件。

fn_list <- getNamespaceExports("ParBayesianOptimization")

for(i in seq_along(fn_list)) {
  header <- paste('\n\n####Function', i, '\n\n\n')
  cat(paste0(header, paste0(getAnywhere(fn_list[i]), collapse = '\n'), '\n\n'), 
      file = 'function.txt', append = TRUE)
}

【讨论】:

  • 哇!这真太了不起了!太感谢了!只是一个问题:是否可以删除出现在每个函数开头和结尾的一些文本?看起来像这样的东西? imgur.com/a/jXp1ykm 非常感谢!你提供的这段代码太漂亮了!
  • 我认为@MrFlick 的方法要好得多。您只需source('funs.R') 即可离线使用所有这些功能。
猜你喜欢
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
  • 2014-06-07
  • 1970-01-01
  • 1970-01-01
  • 2016-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多