2010-06-22 11 views
29

Me gustaría insertar una función dentro de un espacio de nombres de paquete para que pueda acceder a los objetos internos de ese paquete (usemos el paquete de estadísticas como ejemplo). He intentado usarAgregar objetos al espacio de nombres del paquete

myfun <- function(x) print(x) 
env = loadNamespace("stats") 
assign("myfun", myfun , env) 

Pero está bloqueado. Así que traté de desbloquear mi objeto

unlockBinding("myfun", env) 

Dado que myfun aún no existe, no puedo desbloquearlo.

¿Algún ayuda?

Respuesta

28

A lo largo de la línea de la solución de @ Hadley, pero utilizando el entorno del espacio de nombres, ¿qué tal:

environment(myfun) <- asNamespace('stats') 
+0

genial, muchas gracias! – TMS

7

Puede acceder a los objetos internos de un paquete utilizando el operador de tres puntos :::. Eche un vistazo a, por ejemplo, as.roman y utils:::.roman2numeric. (Compare esto con utils::.roman2numeric). Esto podría ayudarlo a evitar tener que poner su función dentro del espacio de nombres.

Es posible que también desee consultar dont.lockBindings en el paquete mvbutils, que detiene el bloqueo de los espacios de nombres.

+0

Si he entendido bien, no puedo desbloquear el espacio un paquete una vez que se bloquea (excepto por recargándolo con dont.lockBindings). Por lo tanto, es imposible agregar una nueva función a posteriori. –

+0

@Etiennebr: AFAIK estás en lo correcto. Una vez que el espacio de nombres está bloqueado, no puede agregarlo. Sigo pensando que ':::' es la forma de proceder. –

14

¿Por qué no simplemente establece el entorno de su nueva función en el lugar correcto?

myfun <- function(x) print(x) 
environment(myfun) <- as.environment("package:stats") 
+0

¡No lo sabía! Pero creo que me gustaría que sea namespace: stats en lugar de package: stats. ¿Hay forma de hacerlo? (Simplemente cambiarlo en .medio ambiente() no funciona). –

+1

El espacio de nombres no es un entorno ... – hadley

+7

Llego tarde a la fiesta, pero esto puede ser útil para otros: el espacio de nombres en realidad es un entorno. 'namespace: stats' es un _descendente_ el entorno global y contiene todos los objetos. Los objetos exportados se copian en 'package: stats', que es un _ancestor_ del entorno global. – wch

Cuestiones relacionadas