隐藏在R中的函数

隐藏在R中的函数,r,function,scope,R,Function,Scope,考虑以下文件.r: foo和bar仅用于有用的内部使用-它们根本不可重用,因为它们需要非常特定的数据布局,具有嵌入式常量,做一些没有人会需要的模糊的事情等等 我不想在有用的{}中定义它们,因为这样会变得太长>10loc 客户端可以执行以下操作以仅在其命名空间中导入有用的内容,但我仍然不确定这是否适用于foo和bar外部可见性: # Source a single function from a source file. # Example use # max.a.posteriori <-

考虑以下文件.r:

foo和bar仅用于有用的内部使用-它们根本不可重用,因为它们需要非常特定的数据布局,具有嵌入式常量,做一些没有人会需要的模糊的事情等等

我不想在有用的{}中定义它们,因为这样会变得太长>10loc

客户端可以执行以下操作以仅在其命名空间中导入有用的内容,但我仍然不确定这是否适用于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 )
}

如何处理循环依赖关系?

我的建议是使用包。它们是为这种情况而创建的。但是仍然不能在纯R中隐藏函数本身。

我的建议是使用包。它们是为这种情况而创建的。但是仍然不能将函数本身隐藏在纯R中。

为了封装foo和bar,您需要实现一个类。在我看来,在R中实现这一点最简单的方法是通过R6Class:。这里有一个关于如何隐藏长度函数的示例。

为了封装foo和bar,您需要实现一个类。在我看来,在R中实现这一点最简单的方法是通过R6Class:。这里有一个关于如何隐藏长度函数的示例。

您可以通过设置有用函数的绑定环境来实现这一点,如下面列出的代码所示。这与包的功能类似,如果您的项目变得更大,我真的建议您使用伟大的devtools包创建一个包

如果函数foo和bar没有被其他函数使用,我只会在有用的内部定义它们。由于函数是相当独立的代码片段,因此即使有用的行数增加,也不会使代码更难理解。当然,除非你被一些指导方针所迫,要保持行数短

有关环境的详细信息,请参阅:


您可以通过设置有用函数的绑定环境来实现这一点,如下面列出的代码所示。这与包的功能类似,如果您的项目变得更大,我真的建议您使用伟大的devtools包创建一个包

如果函数foo和bar没有被其他函数使用,我只会在有用的内部定义它们。由于函数是相当独立的代码片段,因此即使有用的行数增加,也不会使代码更难理解。当然,除非你被一些指导方针所迫,要保持行数短

有关环境的详细信息,请参阅:


你想不想直接给食物/酒吧打电话?如果是,请在有用的范围内定义它们。对函数中的代码行数进行限制似乎。。。古怪的如果没有,你可以把你的函数放到一个迷你包里,只导出有用的函数。我不知道你的第二个问题是什么意思;这似乎是一个非常正交的问题,您还可以创建一个环境,在其中创建foo/bar。惰性版本是my_env=listfoo={},bar={},然后在Usage中调用my_env$foo等。my_env将在惰性版本中可见。另一个技巧是以句点.foo开头它们的名称,但用户仍然可以使用它们。但是,他们不会出现在ls中。你想不想直接给食物/酒吧打电话?如果是,请在有用的范围内定义它们。对函数中的代码行数进行限制似乎。。。古怪的如果没有,你可以把你的函数放到一个迷你包里,只导出有用的函数。我不知道你的第二个问题是什么意思;这似乎是一个非常正交的问题,您还可以创建一个环境,在其中创建foo/bar。惰性版本是my_env=listfoo={},bar={},然后在Usage中调用my_env$foo等。my_env将在惰性版本中可见。另一个技巧是以句点.foo开头它们的名称,但用户仍然可以使用它们。但是,它们不会出现在ls中。您可以通过正确的方式附加环境来完成程序包所做的任何事情,但是您编写程序包的建议是非常正确的。@但是,不,您不能通过正确的方式附加环境来完成程序包所做的任何事情。不过,您可以解决OP在环境方面的问题。除非有充分的理由这样做,否则我不推荐哪种解决方案。这似乎更适合作为一种评论。在问题的特定点上,这似乎也是错误的,尽管制作软件包的建议似乎是正确的(如果不是真正的编码响应)。通过正确的方式附加环境,您可以做软件包所做的任何事情,但是您编写软件包的建议是非常正确的。@snaut,不,您无法通过正确的方式连接环境来完成包所做的任何事情。不过,您可以解决OP在环境方面的问题。除非有充分的理由这样做,否则我不推荐哪种解决方案。这似乎更适合作为一种评论。在t上也似乎是错误的 虽然制作一个包的建议似乎是正确的,但如果不是真正的编码响应,他仍然强调了问题的具体点。。
# 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 )
}
douglas = function() { adams() }
adams = function() { douglas() }
# 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()