修改 base::quit 个默认值

Modifying base::quit defaults

我想更新我的 .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()),那么 qquit 恢复到它们在 base.

中的原始定义

我应该怎么做才能避免这种行为?我想修改 qquit 以便它们仅在我调用 ls(name = "package:base").

时出现

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

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

创建新环境:

> e = new.env()

在那个环境中创建一个退出函数。调用 base::quit 停止无限循环:

> assign("quit",function(){base::quit()},envir=e)

此时"quit"仍是基戒:

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

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