在R中隐藏个人功能

JD *_*ong 33 namespaces r

我的.Rprofile中有一些便利函数,比如这个用于返回内存中对象大小的方便函数.有时我喜欢在不重新启动的情况下清理我的工作区,我这样做rm(list=ls())会删除所有用户创建的对象和我的自定义函数.我真的很想不吹嘘我的自定义功能.

解决这个问题的一种方法似乎是使用我的自定义函数创建一个包,以便我的函数最终在他们自己的命名空间中.这不是特别难,但有没有更简单的方法来确保自定义函数不被rm()杀死?

Rei*_*son 36

结合attachsys.source获取环境并附加该环境.这里我有两个函数在文件中my_fun.R:

foo <- function(x) {
    mean(x)
}

bar <- function(x) {
    sd(x)
}
Run Code Online (Sandbox Code Playgroud)

在加载这些函数之前,显然找不到它们:

> foo(1:10)
Error: could not find function "foo"
> bar(1:10)
Error: could not find function "bar"
Run Code Online (Sandbox Code Playgroud)

创建环境并将文件导入其中:

> myEnv <- new.env()
> sys.source("my_fun.R", envir = myEnv)
Run Code Online (Sandbox Code Playgroud)

仍然不可见,因为我们没有附加任何东西

> foo(1:10)
Error: could not find function "foo"
> bar(1:10)
Error: could not find function "bar"
Run Code Online (Sandbox Code Playgroud)

当我们这样做时,它们是可见的,并且因为我们已将环境的副本附加到搜索路径,所以这些功能在rm()-ed中存活:

> attach(myEnv)
> foo(1:10)
[1] 5.5
> bar(1:10)
[1] 3.027650
> rm(list = ls())
> foo(1:10)
[1] 5.5
Run Code Online (Sandbox Code Playgroud)

我仍然认为你自己的个人套餐会更好,但在此期间,上述内容可能就足够了.只记得搜索路径上的副本只是一个副本.如果函数是相当稳定的并且你没有编辑它们,那么上面的内容可能会有用,但如果你正在开发函数并修改它们,它可能比它的价值更麻烦.

第二种选择是只是他们的名字全部.foo,而不是foo因为ls()除非参数将不返回命名为喜欢的对象all = TRUE设置:

> .foo <- function(x) mean(x)
> ls()
character(0)
> ls(all = TRUE)
[1] ".foo"         ".Random.seed"
Run Code Online (Sandbox Code Playgroud)

  • 个人套餐对于这一点很好,虽然它仍然让我感到困惑,你必须跳过这么多箍来构建一个包.为什么我必须为个人包中的每个功能提供文档? (3认同)
  • 可能是因为我们不想在CRAN上使用未记录的软件包,并且如果R Core允许绕过某些检查,他们必须编写一大堆代码以允许安装和加载缺陷软件包.提供了一些用户工具来帮助编写非正式的包 - 比如roxygen - 所以你维护一个源文件(没有Rd文件)并从那些​​文件中生成包文件. (2认同)
  • 而且您不必记录每个功能.只需将每个函数的\别名{}粘贴到一个帮助文件中,这应该足以打败检查.你不需要\ usage {}部分等,所以不要提供它们.在大量使用NAMESPACES之前,这种技巧经常用于内部包函数. (2认同)
  • @Gavin当前块不会停止出现在CRAN上的未记录的包.正如您所指出的,您可以提供空的文档.人们记录他们的工作,因为没有他们就没有意义.在我看来,如果希望在CRAN上满足某些标准,那么它们应该在进入CRAN时强制执行.目前的保姆方法只是用户敌对. (2认同)

G. *_*eck 22

这有两种方式:

1)让每个函数名都以点开头,例如.f代替f.ls除非您使用ls(all.names = TRUE)它们,否则不会列出此类函数,因此它们不会传递给您的rm命令.

要么,

2)把它放在.Rprofile中

attach(list(
   f = function(x) x, 
   g = function(x) x*x
), name = "MyFunctions")
Run Code Online (Sandbox Code Playgroud)

这些函数将显示为"MyFunctions"在搜索列表中而不是在工作区中命名的组件,并且它们几乎可以像在工作区中一样访问. search()将显示您的搜索列表,ls("MyFunctions")并列出您附加的功能的名称.由于它们不在您的工作区中,因此rm您通常使用的命令不会删除它们.如果你确实希望删除它们使用detach("MyFunctions").


Dir*_*tel 10

加文的答案很精彩,我只是赞成它.仅仅为了完整性,让我再折腾一下:

R> q("no")
Run Code Online (Sandbox Code Playgroud)

其次是

M-x R
Run Code Online (Sandbox Code Playgroud)

创建一个新会话---重新读取.Rprofile.简单,快速,便宜.

除此之外,私人套餐是我书中的方式.

  • 假设一个是在ESS.我是谁 除非我不是. (3认同)