在 R 中创建内部函数(不能从控制台调用)

Posted

技术标签:

【中文标题】在 R 中创建内部函数(不能从控制台调用)【英文标题】:Creating internal functions (can't be called from console) in R 【发布时间】:2016-01-29 18:18:10 【问题描述】:

我正在开发一个 R 包,其中有一个生成一些文件的总体函数,我们将其命名为 main(...),它存在于自己的文件 main.R 中。现在main 调用其他函数,如helper1(...)helper2(...),它们位于helper1.Rhelper2.R 中。是否可以使main 可以调用辅助函数,但用户不能直接调用辅助函数?由于它们的用途截然不同,我将它们分散在不同的文件中。是否将它们全部放在一个文件main.R 下?

【问题讨论】:

是的,阅读namespaces 并决定要导出包中的哪些函数。 所以我的 NAMESPACE 文件应该有 export(main) 行而不是 export(helper1) 等?现在它只匹配我认为是默认的正则表达式。 【参考方案1】:

阅读 Hadley Wickham 的 R packages。

你想要的 应该是包的默认行为:你有导出的和非导出的函数。除非您将函数显式声明为导出,否则它对外部是不可见的,并且只能由包内的其他函数使用。

所以你不需要为辅助函数做任何事情。但是,您需要将 main 函数标记为已导出。

【讨论】:

所以正如@joran 提到的,我需要在我的 NAMESPACE 中更改要导出的内容。默认为exportPattern("^[^\\.]");但是如果我逐行列出要导出的每个函数,并排除helper1helper2,它们可以存在于自己的文件中但不能导出? @TomNash 这取决于NAMESPACE 文件的生成方式。默认情况下它应该是空的,但 R 的 package.skeleton 函数确实会生成一个非空的 NAMESPACE 文件。首先删除其中的所有内容是个好主意。无论如何,您永远不应该自己触摸该文件,使用 devtools 并让文件自动生成(我的答案中的链接解释了如何)。 @TomNash 许多人喜欢 Hadley 的包开发风格的一件事是,您最终使用 roxygen2 来记录您的函数,这让您可以使用函数指定要在文件中导出哪些函数,并且 roxygen2 为您构建 NAMESPACE 文件。 我明白了,roxygen2 在制作降价和导出函数方面似乎非常强大。认为我现在已经被排除在外了。

以上是关于在 R 中创建内部函数(不能从控制台调用)的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能从内部调用一个类的 start 函数?

无法在 razorpay [firebase_functions/internal] 内部的 firebase 云函数中创建订单 ID

在 CodeIgniter 控制器中创建函数

如何在 PL/pgSQL 中创建嵌套函数?

内部有闭包的递归函数

从函数内部将函数环境设置为调用环境(parent.frame)的环境