2011-12-28 23 views
5

¿Podría alguien explicar el siguiente código? Estoy reemplazando la función de diseño en el paquete de gráficos con mi propia versión, pero parece que volverá a aparecer mágicamenteReemplazar permanentemente una función

env = environment(graphics:::layout) 
unlockBinding("layout" , env = env) 
assign("layout" , function(){} , envir = env) 
lockBinding("layout" , env = env) 

# this still shows the original layout function! how is that possible? 
layout 

# this shows function(){} as expected 
graphics:::layout 
+0

todos - me disculpo por todas las preguntas relacionadas con los entornos últimamente. Esto está demostrando ser un tema complicado y confuso. Si hay algún material de lectura recomendado (aparte de los archivos PDF estándar R que no son muy útiles) ¡por favor hágamelo saber! – SFun28

+1

No te disculpes; He aprendido mucho de ellos yo mismo. No tengo yo, pero he oído que el [Cámaras] (http://www.amazon.com/Software-Data-Analysis-Programming-Statistics/dp/1441926127/ref=sr_1_9?s=books&ie = UTF8 & qid = 1325110851 & sr = 1-9) book es una especie de programación de R (a diferencia de informática estadística) biblia. – joran

+0

De hecho acabo de pedir ese libro hace una hora. =) no puedo esperar para bajarlo. Gracias por las palabras de aliento, joran! – SFun28

Respuesta

6

El problema es que se está asignando su nueva versión de layout al espacio de nombres gráficos , que es lo que devuelve environment(graphics:::layout). Usted lugar quieren hacer la asignación en los gráficos adjuntos paquete (es decir, el medio ambiente aparecen como "package:graphics" en su ruta de búsqueda).

En su ejemplo, cuando se busca layout, R Búsquedas la lista de paquetes adjuntos devueltos por search(), y se encuentra en el original layoutpackage:graphics, antes de que alguna vez se pone a funcionar que ha asignado en namespace:graphics.

La solución es simple, requiriendo sólo un cambio de ambiente asignado a env en la primera línea:

# Assign into <environment: package:graphics> 
# rather than <environment: namespace:graphics> 
env <- as.environment("package:graphics") 

unlockBinding("layout" , env = env) 
assign("layout" , function(){} , envir = env) 
lockBinding("layout" , env = env) 

# Now it works as expected 
layout 
# function(){} 

Un poco más elaboración, que puede ser útil para algunos:

search() # Shows the path along which symbols typed at the command 
      # will be searched for. The one named "package:graphics" 
      # is where 'layout' will be found. 

# None of these return the environment corresponding to "package graphics" 
environment(layout) 
environment(graphics::layout) 
environment(graphics:::layout) 

# This does 
as.environment("package:graphics") 
+0

gracias, Josh! Entonces, ¿por qué 'env = environment (graphics ::: layout)' no funciona, pero 'env <- as.environment (" package: graphics ")' no? – SFun28

+1

Vea también 'assignInNamespace' - las cosas se vuelven más complicadas si desea cambiar los métodos S3. – hadley

+0

@ SFun28: el primero te proporciona el entorno de espacio de nombres que solo utilizan los gráficos, el segundo te proporciona el entorno de paquete de gráficos que usa todo lo demás. (No estoy seguro de cómo afectaría esto a otros paquetes adjuntos que importan gráficos) – hadley

Cuestiones relacionadas