Я хотел бы обновить свой .Rprofile, чтобы изменить base::quit. Обычное поведение q и quit заключается в том, чтобы предложить вам спросить, хотите ли вы сохранить свое рабочее пространство. Я хотел бы изменить эти функции, чтобы по умолчанию они не сохраняли мое рабочее пространство, например, изменив функции, как показано ниже:
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 There are a few reasons for this. I often run R from the command line to inspect data files in directories where I’d like to be able to count on every file being a data file, and so don't want any dotfiles cluttering the directory. Moreover, any analysis or cleaning I do in the console is not likely to be reproducible.





Попробуйте следующее - это работает в командной строке, но не проверено в сценарии запуска:
Создайте новую среду:
> 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()}
поскольку он прикреплен, где-то все еще есть ссылка на него. Я думаю. Во всяком случае, попробуйте.
Что ж, если это все потому, что вы хотите использовать
rm(list=ls()), то, вероятно, проблема в этом. Это не та команда, которую вам действительно нужно запускать так часто. Есть ли причина, по которой вам нужно это сделать? Похоже, у вас, вероятно, есть другие проблемы с областью видимости переменных. Вы не можете заставить пользовательскую функцию исчезнуть из глобальной среды. Вам придется сделать свой собственный пакет, чтобы «скрыть» эти функции.