隐藏在R中的函数

时间:2018-06-24 07:01:14

标签: r function scope r-base

请考虑以下file.r

foo = function(){}
bar = function(){}
useful = function() {foo(); bar()}

foobar仅供useful内部使用-它们根本不可重用,因为它们需要非常特定的数据布局,具有嵌入的常量,难以理解的内容没有人需要等等。

我不想在useful{}中定义它们,因为那样会太长(> 10 LOC)。

客户端可以执行以下操作以仅将useful导入其命名空间中,但我仍然不确定这是否适用于foobar外部可见性:

# 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() }

如何处理循环依赖?

3 个答案:

答案 0 :(得分:2)

您可以通过设置useful函数的绑定环境来实现此目的,如下面列出的代码。这类似于软件包的功能,如果您的项目越来越大,我真的建议您使用出色的devtools软件包创建一个软件包。

如果其他函数未使用函数foobar,则只需在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中最简单的方法是通过R6classeshttps://cran.r-project.org/web/packages/R6/vignettes/Introduction.html#private-members。那里有一个如何隐藏length函数的示例。