JD *_*ong 33 namespaces r
我的.Rprofile中有一些便利函数,比如这个用于返回内存中对象大小的方便函数.有时我喜欢在不重新启动的情况下清理我的工作区,我这样做rm(list=ls())会删除所有用户创建的对象和我的自定义函数.我真的很想不吹嘘我的自定义功能.
解决这个问题的一种方法似乎是使用我的自定义函数创建一个包,以便我的函数最终在他们自己的命名空间中.这不是特别难,但有没有更简单的方法来确保自定义函数不被rm()杀死?
Rei*_*son 36
结合attach并sys.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)
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.简单,快速,便宜.
除此之外,私人套餐是我书中的方式.