2010-08-10 16 views
7

En R, es posible proteger nombres de funciones (o variables en general) para que no puedan enmascararse.Nombres de funciones de protección en R

Recientemente me dí cuenta de que esto puede ser un problema al crear un marco de datos con el nombre "nuevo", que enmascaró una función utilizada por lmer y por lo tanto dejó de funcionar. (La recuperación es fácil una vez que sepa cuál es el problema, aquí "rm (nuevo)" lo hizo).

+0

una trama de datos no puede sobrescribir una función. Puede usar ambos al mismo tiempo. – James

+0

"Sobrescribir" fue la palabra incorrecta. ¿Máscara? – AndyF

+1

Duplicado de http://stackoverflow.com/questions/936748/declaring-a-const-variable-in-r – hadley

Respuesta

4

¡Quizás utilice entornos! Esta es una gran manera de separar espacios de nombres. Por ejemplo:

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

Por supuesto, alguien podría sobrescribir 'a' :) – geoffjentry

2

@hdallazuanna recomienda (via Twitter)

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

esto tiene sentido cuando la variable es creado por el usuario, pero no, por supuesto, evitar sobrescribir una función de un paquete.

6

Existe una solución fácil para su problema, sin preocuparse por proteger nombres de variables (aunque jugar con lockBinding parece divertido). Si una función se enmascara, como en su ejemplo, aún es posible llamar a la versión enmascarada, con la ayuda del operador ::.

En general, la sintaxis es packagename::variablename.

(Si la función que desea no se ha exportado desde el paquete, entonces se necesitan tres colones lugar, :::. Esto no debe aplicarse en este caso, sin embargo.)

+0

No funciona si estoy llamando a una función , en un paquete, que se basa en una función en otro lugar que se ha enmascarado inadvertidamente. – AndyF

+0

@AndyF Sí, ese es un buen punto. Veo un tema en las respuestas: R no protege a los usuarios de sí mismos. Esto es muy similar a Linux. ;) –

Cuestiones relacionadas