trademap socios oec noruega mexico importaciones exportaciones español datos comerciales argentina angola function r namespaces package

function - oec - socios comerciales de mexico



Anular una función que se importa en un espacio de nombres (3)

Como la función de termplot en R contiene algún código extraño que me está dando errores molestos, quiero anularlo en mi propio código de prueba hasta que encuentre una solución más permanente. El problema es que la función modificada no está cargada por el paquete mgcv . El paquete mgcv carga termplot desde el paquete de estadísticas en su espacio de nombres, usando importFrom() en el archivo NAMESPACE.

¿Cómo puedo convencer a mgcv de usar el termplot cambiado? Lo intenté :

unlockBinding("termplot", as.environment("package:stats")) assign("termplot", my.termplot, as.environment("package:stats")) lockBinding("termplot", as.environment("package:stats"))

y cuando se aplica a lm-objects, esto funciona y se usa la termplot alterada. Pero al usar gam-objects hechos por el paquete mgcv, esto no funciona. Realmente no voy a construir el paquete de estadísticas desde la fuente si puedo evitarlo ...

Para aclarar, también intenté con

assignInNamespace("termplot", my.termplot, ns="stats") assignInNamespace("termplot", my.termplot, ns="mgcv")

en todas las combinaciones posibles, antes de adjuntar mgcv, después de adjuntar mgcv, y no logré ponerlo en funcionamiento.

EDITAR:

Intenté todas las opciones dadas aquí (aparte de reconstruir cualquier paquete), y no pude hacer que funcionara. La salida más fácil para mí es usar una función de envoltura. Esa discusión se puede encontrar here . Gracias por todos los consejos.

Un ejemplo reproducible:

my.termplot <- function (x) print("my new termplot") unlockBinding("termplot", as.environment("package:stats")) assignInNamespace("termplot", my.termplot, ns="stats", envir=as.environment("package:stats")) assign("termplot", my.termplot, as.environment("package:stats")) lockBinding("termplot", as.environment("package:stats")) y <- 1:10 x <- 1:10 xx <- lm(y~x) termplot(xx) require(mgcv) dat <- gamSim(1, n = 400, dist = "normal", scale = 2) b <- gam(y ~ s(x0) + s(x1) + s(x2) + x3, data = dat) plot(b,all=TRUE)

plot.gam llama a termplot para los términos no suaves (x3 en este caso), pero no puede encontrar la nueva función de termploto.

EDIT2: al parecer, mi ejemplo funciona. Ahora veo que resolví mi propia pregunta: en el primer código, no agregué tanto el espacio de nombres como el paquete en assignInNamespace. Es importante recordar cambiar la función tanto en el espacio de nombres como en el paquete antes de cargar el otro paquete. Thx @hadley por apuntarme en la dirección correcta, @Marek por probar el código e informar que funciona, y el resto por tomarse el trabajo de responder.


Creo que la función trace () hace automáticamente lo que se intenta arriba. Hacer:

trace(''termplot'', edit=''gedit'')

Donde ''gedit'' es el nombre de un editor de texto. El editor se abrirá con el código original y puede pegar cualquier código de sustitución que desee.

Para volver a la versión original simplemente destrazar (''termplot'')

Advertencia: Intenté usar esto cuando el editor de texto tenía muchos archivos abiertos y no funcionaba. Así que uso ''gedit'', un editor de texto en mi sistema que no uso a menudo. De esta manera, estoy seguro de que R abrirá una nueva instancia de ''gedit''.

No estoy seguro de que esto ayude, pero creo que vale la pena intentarlo. La secuencia de búsqueda cuando hay espacios de nombres es realmente confusa.


Estoy perplejo, no puedo entender cómo plot.gam está localizando termplot , no estoy usando las reglas comunes de alcance hasta donde yo sé. Esto parece necesitar una comprensión más profunda de los espacios de nombres de los que poseo actualmente.

my.termplot <- function (x) print("my new termplot") # where is it defined? getAnywhere("termplot") # in package and in namespace unlockBinding("termplot", as.environment("package:stats")) assign("termplot", my.termplot, "package:stats") unlockBinding("termplot", getNamespace("stats")) assign("termplot", my.termplot, getNamespace("stats")) getAnywhere("termplot")[1] getAnywhere("termplot")[2] # now changed in both places y <- 1:10 x <- 1:10 + runif(10) xx <- lm(y ~ x) termplot(xx) # works library("mgcv") b <- gam(y ~ s(x), data = data.frame(x, y)) plot(b) # still calls the old termplot # I''m mystified - if try and find termplot as # seen from the environment of plot.gam, it looks # like what we want get("termplot", environment(plot.gam))


Intente sobrescribir la función a la que está llamando termplot . Supongo que esto es plot.gam en el paquete mgcv .

Primero cargue el paquete necesario.

library(mgcv)

Aquí está su función de termplot alternativo, agregada al espacio de nombres de stats .

my.termplot <- function (model, ...) { message("In my.termplot") } unlockBinding("termplot", as.environment("package:stats")) assign("termplot", my.termplot, as.environment("package:stats")) lockBinding("termplot", as.environment("package:stats"))

Del mismo modo, aquí está la función de envoltura, agregada al espacio de nombres mgcv .

my.plot.gam <- function (x, ...) { message("In my.plot.gam") my.termplot() } unlockBinding("plot.gam", as.environment("package:mgcv")) assign("plot.gam", my.plot.gam, as.environment("package:mgcv")) lockBinding("plot.gam", as.environment("package:mgcv"))

Aquí hay un ejemplo para probarlo, tomado de ?gam .

dat <- gamSim(1, n = 400, dist = "normal", scale = 2) b <- gam(y ~ s(x0) + s(x1) + s(x2) + s(x3), data = dat) plot(b)