我想更新我的.Rprofile
来修改base::quit
。 q
和quit
的正常行为是提示您询问是否要保存工作区。我想修改这些功能,以便它们默认不保存我的工作空间,例如,通过如下修改功能 1 :
q <- function(save = "no") {
quit(save = save)
}
quit <- function(save = "no") {
quit(save = save)
}
但是,这里有一个问题。 (我对R
有点陌生,因此我的描述可能并不十分准确。)函数q
和quit
已添加到全局环境中。结果,如果我调用ls()
,这些功能将包括在内。添加以下代码
environment(q) <- as.environment("package:base")
似乎将q
添加到base
命名空间。也就是说,我看到以下内容:
# > q
# function(save = "no", ...)
# {
# quit(save = save), ...)
# }
# <environment: base>
但是,当我呼叫ls()
时,q
和quit
仍然出现,如果我呼叫rm(list = ls())
,则q
和{{1} }恢复为quit
中的原始定义。
我应该怎么做才能避免这种现象?我希望修改base
和q
,以便它们仅在我呼叫quit
时出现。
1 这样做的原因有很多。我经常从命令行运行R来检查目录中的数据文件,在这些目录中,我希望能够依靠每个文件作为数据文件,因此不要让任何点文件弄乱目录。而且,我在控制台中所做的任何分析或清理都不太可能重复。
答案 0 :(得分:2)
尝试以下方法-它会在提示符下运行,但未在启动脚本中进行测试:
创建一个新环境:
> e = new.env()
在该环境中创建退出函数。调用base::quit
停止无限循环:
> assign("quit",function(){base::quit()},envir=e)
在这一点上,“退出”仍然是基本退出:
> quit
function (save = "default", status = 0, runLast = TRUE)
.Internal(quit(save, status, runLast))
<bytecode: 0x55c7741932f8>
<environment: namespace:base>
因此,我们附加了环境:
> attach(e)
The following object is masked from package:base:
quit
现在退出就是我们的退出:
> quit
function(){base::quit()}
我们工作区中唯一的东西是e
:
> ls()
[1] "e"
但是我们可以删除它:
> rm(e)
> ls()
character(0)
而我们的quit
仍然是我们的quit
:
> quit
function(){base::quit()}
由于其附件,因此在某处仍然有对其的引用。我认为。无论如何,尝试一下。