Модификация base :: quit по умолчанию - PullRequest
0 голосов
/ 01 марта 2019

Я хотел бы обновить мой .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 иquit вернуться к своим первоначальным определениям в base.

Что я должен делать, чтобы избежать такого поведения?Я бы хотел, чтобы q и quit были изменены, чтобы они появлялись только тогда, когда я звоню ls(name = "package:base").


1 Для этого есть несколько причин.Я часто запускаю R из командной строки для проверки файлов данных в каталогах, где я хотел бы иметь возможность рассчитывать на каждый файл, являющийся файлом данных, и поэтому не хочу, чтобы какие-либо точечные файлы загромождали каталог.Более того, любой анализ или очистка, которую я выполняю в консоли, вряд ли будет воспроизводимой.

1 Ответ

0 голосов
/ 01 марта 2019

Попробуйте следующее - оно работает по приглашению, но не проверено в сценарии запуска:

Создайте новую среду:

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

, поскольку он прикреплен, где-то есть ссылка на него.Я думаю.В любом случае, попробуйте.

...