请考虑以下file.r
:
foo = function(){}
bar = function(){}
useful = function() {foo(); bar()}
foo
和bar
仅供useful
内部使用-它们根本不可重用,因为它们需要非常特定的数据布局,具有嵌入的常量,难以理解的内容没有人需要等等。
我不想在useful{}
中定义它们,因为那样会太长(> 10 LOC)。
客户端可以执行以下操作以仅将useful
导入其命名空间中,但我仍然不确定这是否适用于foo
和bar
外部可见性:
# Source a single function from a source file.
# Example use
# max.a.posteriori <- source1( "file.r","useful" )
source1 <- function( path, fun )
{
source( path, local=TRUE )
get( fun )
}
如何在file.r
端正确执行此操作,即仅导出特定功能?
此外,还有功能排序的问题,我认为这与上述问题有关。让我们来
douglas = function() { adams() }
adams = function() { douglas() }
如何处理循环依赖?
答案 0 :(得分:2)
您可以通过设置useful
函数的绑定环境来实现此目的,如下面列出的代码。这类似于软件包的功能,如果您的项目越来越大,我真的建议您使用出色的devtools
软件包创建一个软件包。
如果其他函数未使用函数foo
和bar
,则只需在useful
内定义它们。由于这些函数是非常独立的代码段,因此即使useful
的行数增加,也不会使代码的理解变得更加复杂。 (当然,除非您被某些准则强迫使行数保持简短。)
有关环境的更多信息,请参见:http://adv-r.had.co.nz/Environments.html
# define new environment
myenv <- new.env()
# define functions in this environment
myenv$foo <- function(){}
myenv$bar <- function(){}
# define useful in global environment
useful <- function(){
foo()
bar()
}
# useful does not find the called functions so far
useful()
# neither can they be found in the globalenv
foo()
# but of course in myenv
myenv$foo()
# set the binding environment of useful to myenv
environment(useful) <- myenv
# everything works now
useful()
foo()
答案 1 :(得分:1)
我的建议是使用软件包。它们是为这种情况而创建的。但是仍然不能将函数本身隐藏在纯R中。
答案 2 :(得分:1)
为了封装foo和bar,您需要实现class
。我认为,在R中最简单的方法是通过R6classes
:https://cran.r-project.org/web/packages/R6/vignettes/Introduction.html#private-members。那里有一个如何隐藏length
函数的示例。