【问题标题】:namespacing functions in a directory in RR中目录中的命名空间函数
【发布时间】:2025-12-27 12:10:10
【问题描述】:

假设我有一个包含自定义 R 函数的目录。

即,

myDir/f1.R
myDir/f2.R

如何将它们导入 R 以保留命名空间?

也就是说,要在 R 中调用它们,我会这样称呼它们:

myDir::f1(<input>)

相对于f1(<input>)

这是在基础包中使用源代码时的默认行为。

【问题讨论】:

  • sourceDir 真的是基础包吗? library(sourceDir)....“没有名为‘sourceDir’的包”。我在一个名为xhmmScripts 的看起来有点晦涩的包中看到了一个名为sourceDir函数。是那个吗?
  • @Hack-R 我认为他们只是对术语感到困惑,并且指的是在示例中为 source 函数创建的函数。
  • @Dason 哦,我明白了。谢谢。如果您有该功能随时可用,也许您可​​以编辑问题并将其粘贴?
  • sourceDir 是基础包中的一个函数(我认为),如果不仅仅是 source 也可以,就这个问题而言,它并没有太大的区别。
  • 要使用myDir::f1(<input>) 调用它们,您需要创建一个名为myDir 的包并将您的R 文件添加到/R 目录。

标签: r namespaces


【解决方案1】:

这并不能完全回答您的问题,但无论如何可能会对您有所帮助: 我经常在日常工作中获取/使用很多函数,在全局环境中拥有如此多的函数定义真的很烦人。我的解决方案是将相关函数封装在一个返回列表的虚拟函数中:

myFunctionNameSpace <- function() {

    function1 <- function(x) {
        print(paste0("Function 1 was called with argument ", x))   
    }

    function2 <- function(x) {
        helperFunction1()
        print(paste0("Function 2 was called with argument ", x))
    }

    helperFunction1 <- function() {
        print("Helper function 1 was called.")
    }


    return(list(
        function1 = function1,
        function2 = function2
    ))
}

myFunctionNameSpace <- myFunctionNameSpace()

如果您获取上面的代码,您将在您的环境中获得一个对象myFunctionNameSpace。然后,您可以使用 $ 运算符调用函数:

myFunctionNameSpace$function1(17)
myFunctionNameSpace$function2(42)

请注意,这也会隐藏您不想导出的任何“辅助函数”。它还允许嵌套此类“命名空间”,最后但并非最不重要的是,它与 RStudios 的自动完成功能配合得非常好。

【讨论】:

  • 嗨 AEF,这是有道理的,感谢您的建议。