首页 > 解决方案 > 修改 base::quit 默认值

问题描述

我想更新我.Rprofile的修改base::quitq和的正常行为quit是提示您询问是否要保存工作区。我想修改这些函数,使它们默认不保存我的工作区,例如,通过如下修改函数

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

然而,这里有一个问题。(我对 有点新R,所以我的描述可能并不完全准确。) 函数qquit被添加到全局环境中。因此,如果我调用ls(),这些函数将被包含在内。添加以下代码

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

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

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

但是,当我调用 时ls()q两者quit仍然出现,如果我调用它们,rm(list = ls())则两者都q恢复quitbase.

我应该怎么做才能避免这种行为?我希望qquit进行修改,以便它们仅在我调用时出现ls(name = "package:base")


1这有几个原因。我经常从命令行运行 R 来检查目录中的数据文件,我希望能够将每个文件都视为数据文件,因此不希望任何点文件使目录混乱。此外,我在控制台中所做的任何分析或清理都不太可能重现。

标签: rdotfiles

解决方案


尝试以下操作 - 它在提示符下工作,但未在启动脚本中测试:

创建一个新环境:

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

因为它是附加的,所以在某个地方仍然有对它的引用。我认为。不管怎样,试试吧。


推荐阅读