2010-08-10 3 views
7

Возможно ли в R защитить имена функций (или переменные в целом), чтобы они не могли быть замаскированы.Названия функций защиты в R

Недавно я заметил, что это может быть проблемой при создании кадра данных с именем «новый», который маскировал функцию, используемую lmer, и, таким образом, остановил ее работу. (Восстановление легко, как только вы знаете, в чем проблема, здесь «rm (new)» сделал это.)

+0

Фрейм данных не может перезаписать функцию. Вы можете использовать оба одновременно. – James

+0

«Переписать» было неправильным словом. Маска? – AndyF

+1

Дубликат http://stackoverflow.com/questions/936748/declaring-a-const-variable-in-r – hadley

ответ

4

Возможно использование сред! Это отличный способ разделить пространства имен. Например:

> a <- new.env() 
> assign('printer', function(x) print(x), envir=a) 
> get('printer', envir=a)('test!') 
[1] "test!" 
+2

Конечно, кто-то может перезаписать 'a' :) – geoffjentry

2

@hdallazuanna рекомендует (via Twitter)

new <- 1 
lockBinding('new', globalenv()) 

это имеет смысл, когда переменная создана пользователь, но не, конечно, предотвратить перезапись функции из пакета.

6

Существует непростая обходная проблема для вашей проблемы, не беспокоясь о защите имен переменных (хотя игра с lockBinding действительно выглядит весело). Если функция маскируется, как и в вашем примере, по-прежнему можно вызвать маску версию с помощью оператора ::.

В целом, синтаксис packagename::variablename.

(Если функция, которую вы хотите, не были экспортированы из пакета, то вам нужно три колоны вместо :::. Это не должно применяться в этом случае, однако.)

+0

Не работает, если я вызываю функцию , в пакете, который опирается на функцию в другом месте, которая непреднамеренно замаскировалась. – AndyF

+0

@ AndyF да, это хороший момент. Я вижу тему в ответах: R не защищает пользователей от самих себя. Это очень похоже на Linux. ;) –