在 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.R
和helper2.R
中。是否可以使main
可以调用辅助函数,但用户不能直接调用辅助函数?由于它们的用途截然不同,我将它们分散在不同的文件中。是否将它们全部放在一个文件main.R
下?
【问题讨论】:
是的,阅读namespaces 并决定要导出包中的哪些函数。 所以我的 NAMESPACE 文件应该有export(main)
行而不是 export(helper1)
等?现在它只匹配我认为是默认的正则表达式。
【参考方案1】:
阅读 Hadley Wickham 的 R packages。
你想要的是 应该是包的默认行为:你有导出的和非导出的函数。除非您将函数显式声明为导出,否则它对外部是不可见的,并且只能由包内的其他函数使用。
所以你不需要为辅助函数做任何事情。但是,您需要将 main
函数标记为已导出。
【讨论】:
所以正如@joran 提到的,我需要在我的 NAMESPACE 中更改要导出的内容。默认为exportPattern("^[^\\.]")
;但是如果我逐行列出要导出的每个函数,并排除helper1
和helper2
,它们可以存在于自己的文件中但不能导出?
@TomNash 这取决于NAMESPACE
文件的生成方式。默认情况下它应该是空的,但 R 的 package.skeleton
函数确实会生成一个非空的 NAMESPACE
文件。首先删除其中的所有内容是个好主意。无论如何,您永远不应该自己触摸该文件,使用 devtools 并让文件自动生成(我的答案中的链接解释了如何)。
@TomNash 许多人喜欢 Hadley 的包开发风格的一件事是,您最终使用 roxygen2 来记录您的函数,这让您可以使用函数指定要在文件中导出哪些函数,并且 roxygen2 为您构建 NAMESPACE 文件。
我明白了,roxygen2
在制作降价和导出函数方面似乎非常强大。认为我现在已经被排除在外了。以上是关于在 R 中创建内部函数(不能从控制台调用)的主要内容,如果未能解决你的问题,请参考以下文章
无法在 razorpay [firebase_functions/internal] 内部的 firebase 云函数中创建订单 ID