Можно ли в R защитить имена функций (или переменные в целом), чтобы они не могли быть замаскированы.
Я недавно заметил, что это может быть проблемой при создании фрейма данных с именем «новый», который маскирует функцию, используемую lmer, и, таким образом, останавливает ее работу. (Восстановление легко, если вы знаете, в чем проблема, здесь это сделал "rm (new)".)
Существует простой способ решения вашей проблемы, не беспокоясь о защите имен переменных (хотя игра с lockBinding
выглядит забавно). Если функция становится замаскированной, как в вашем примере, все еще можно вызвать замаскированную версию с помощью оператора ::
.
Обычно используется синтаксис имя_пакета :: имя_переменной
.
(Если нужная функция не была экспортирована из пакета, вместо этого вам понадобятся три двоеточия, :::
. Однако в данном случае это не применимо.)
@hdallazuanna рекомендует (через Twitter)
new <- 1
lockBinding('new', globalenv())
это имеет смысл, когда переменная создается пользователем, но, конечно, не предотвращает перезапись функции из пакета.
Может быть, использовать среды! Это отличный способ разделить пространства имен. Например:
> a <- new.env()
> assign('printer', function(x) print(x), envir=a)
> get('printer', envir=a)('test!')
[1] "test!"