修改base :: quit默认值

时间:2019-03-01 18:57:47

标签: r dotfiles

我想更新我的.Rprofile来修改base::quitqquit的正常行为是提示您询问是否要保存工作区。我想修改这些功能,以便它们默认不保存我的工作空间,例如,通过如下修改功能 1

q <- function(save = "no") {
    quit(save = save)
}
quit <- function(save = "no") {
    quit(save = save)
}

但是,这里有一个问题。 (我对R有点陌生,因此我的描述可能并不十分准确。)函数qquit已添加到全局环境中。结果,如果我调用ls(),这些功能将包括在内。添加以下代码

environment(q) <- as.environment("package:base")

似乎将q添加到base命名空间。也就是说,我看到以下内容:

# > q
# function(save = "no", ...)
# {
#     quit(save = save), ...)
# }
# <environment: base>

但是,当我呼叫ls()时,qquit仍然出现,如果我呼叫rm(list = ls()),则q和{{1} }恢复为quit中的原始定义。

我应该怎么做才能避免这种现象?我希望修改baseq,以便它们仅在我呼叫quit时出现。


1 这样做的原因有很多。我经常从命令行运行R来检查目录中的数据文件,在这些目录中,我希望能够依靠每个文件作为数据文件,因此不要让任何点文件弄乱目录。而且,我在控制台中所做的任何分析或清理都不太可能重复。

1 个答案:

答案 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()}

由于其附件,因此在某处仍然有对其的引用。我认为。无论如何,尝试一下。