gpt4 book ai didi

r - 没有包的命名空间

转载 作者:行者123 更新时间:2023-12-03 12:01:59 25 4
gpt4 key购买 nike

在重组我的代码库时,我想清理我的代码共享机制。到目前为止,我正在使用 source用于许多小型、大部分独立的功能模块。

然而,这种方法存在许多问题,其中包括

  • 缺乏循环测试(意外循环 source 链),
  • 正确指定包含路径所需的复杂语法(chdir=TRUE 参数,硬编码路径),
  • 名称冲突的可能性(重新定义对象时)。

  • 理想情况下,我想获得与 Python 模块机制类似的东西。 R 包机制在这里会有点矫枉过正: 我不想生成嵌套路径层次结构、包含大量元数据的多个文件并手动构建包 只是为了获得一个小的、独立的、可重用的代码模块。

    现在我正在使用一个代码片段来解决上面提到的前两个问题。包含的语法如下:
    import(functional)
    import(io)
    import(strings)

    …并且模块被定义为驻留在本地路径中的简单源文件。 The definition of import is straightforward但我无法解决第三点:我想将模块导入到单独的命名空间中,但据我所知,命名空间查找机制与包非常紧密。没错,我可以覆盖 `::`getExportedValue也许 asNamespaceisNamespace但这感觉很脏,并且有可能破坏其他包装。

    最佳答案

    这是一个完全自动化包创建、编译和重新加载的函数。正如其他人所指出的,效用函数 package.skeleton()devtools::load_all()已经让你几乎一直到那里。这只是结合了它们的功能,使用 package.skeleton()load_all() 时清理的临时目录中创建源目录完成处理它。

    您需要做的就是指向要从中读取函数的源文件,并为包命名:import()剩下的为你做。

    import <- function(srcFiles, pkgName) {
    require(devtools)
    dd <- tempdir()
    on.exit(unlink(file.path(dd, pkgName), recursive=TRUE))
    package.skeleton(name=pkgName, path = dd, code_files=srcFiles)
    load_all(file.path(dd, pkgName))
    }

    ## Create a couple of example source files
    cat("bar <- function() {print('Hello World')}", file="bar.R")
    cat("baz <- function() {print('Goodbye, cruel world.')}", file="baz.R")

    ## Try it out
    import(srcFiles=c("bar.R", "baz.R"), pkgName="foo")

    ## Check that it worked
    head(search())
    # [1] ".GlobalEnv" "package:foo" "package:devtools"
    # [4] "package:stats" "package:graphics" "package:grDevices"
    bar()
    # [1] "Hello World"
    foo::baz()
    # [1] "Goodbye, cruel world."

    关于r - 没有包的命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15789036/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com