【问题标题】:Modifying base::quit defaults修改 base::quit 默认值
【发布时间】:2019-03-01 18:57:46
【问题描述】:

我想更新我的.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 来检查目录中的数据文件,我希望能够将每个文件都视为数据文件,因此不希望任何点文件使目录混乱。此外,我在控制台中所做的任何分析或清理都不太可能重现。

【问题讨论】:

  • 好吧,如果这都是因为你想使用rm(list=ls()),那么这可能就是问题所在。这不是你应该经常运行的命令。你有理由这样做吗?听起来您可能还有其他变量范围问题。您不能使自定义函数从全局环境中消失。您必须制作自己的包来“隐藏”这些功能。

标签: r dotfiles


【解决方案1】:

尝试以下方法 - 它可以在提示符下工作,但未在启动脚本中进行测试:

创建一个新环境:

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

因为它是附加的,所以在某处仍有对其的引用。我认为。无论如何,试试吧。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-06
    • 2022-10-24
    相关资源
    最近更新 更多