Come sovrascrivo una funzione non visibile nello spazio dei nomi del pacchetto?

Fondamentalmente voglio cambiare una funzione non visibile di un pacchetto. Per le funzioni visibili, vale a dire le funzioni che non hanno un asterisco quando vengono chiamati methods , ho trovato due post su come ho potuto raggiungere il mio objective:

  1. Usa assignInNamespace : vedi post su R-help .
  2. Usa fix : vedi post su stackoverflow

Sebbene entrambi gli approcci funzionino per una funzione esportata / visibile (io uso predict.lm come esempio più avanti per il secondo approccio e testato il primo approccio con la funzione subset.data.frame ), non funzionano per una funzione non visibile ad es. predict.ar . Perché? C’è una soluzione?

Ecco un esempio minimo:

Mostra che predict.lm è visibile, predice.ar non lo è:

 methods(predict) [1] predict.Arima* predict.HoltWinters* predict.StructTS* [4] predict.ar* predict.arima0* predict.glm [7] predict.lm predict.loess* predict.mlm [10] predict.nls* predict.poly predict.ppr* [13] predict.prcomp* predict.princomp* predict.smooth.spline* [16] predict.smooth.spline.fit* 

Applicare predict.lm :

 x <- rnorm(5) y <- x + rnorm(5) predict(lm(y ~ x)) # 1 2 3 4 5 # 1.0783047 1.5288031 0.3268405 0.8373520 -0.9833746 

Cambia predict.lm inserendo cat (“Prima riga modificata per predict.lm \ n”) all’inizio del corpo della funzione. (Devi farlo manualmente nell’editor):

 fix(predict.lm) predict(lm(y ~ x)) # First line changed for predict.lm # 1 2 3 4 5 # 1.0783047 1.5288031 0.3268405 0.8373520 -0.983374 

Applicare predict.ar :

 sunspot.ar <- ar(sunspot.year) predict(sunspot.ar, n.ahead=25) # $pred # Time Series: # Start = 1989 # End = 2013 

Prova a cambiare predict.ar :

 fix(predict.ar) #Here, an empty function body appears for me fix("stats:::predict.ar") #Here as well fix(stats:::predict.ar) #Error in fix(stats:::predict.ar) : 'fix' requires a name 

Prova ad usare assignInNamespace invece. (Si noti che ho appena copiato la funzione stats:::predict.ar in un editor e aggiunto la riga cat("First line changed for predict.ar\n") all’inizio del corpo, perché il corpo della funzione è piuttosto lungo , Mostro solo il primo paio di righe qui)

 mypredict <- function (object, newdata, n.ahead = 1, se.fit = TRUE, ...) { cat("First line changed for predict.ar\n") if (n.ahead < 1) stop("'n.ahead' must be at least 1") #Rest of body of stats:::predict.ar } assignInNamespace("predict.ar", mypredict, ns="stats") predict(sunspot.ar, n.ahead=25) # First line changed for predict.ar # Error in predict.ar(sunspot.ar, n.ahead = 25) : # object 'C_artoma' not found 

Poiché “First line changed for predict.ar” viene effettivamente stampato sulla console, prediction.ar deve essere stato modificato. Tuttavia, perché l’object “C_artoma” non viene più trovato?

AGGIORNAMENTO: OK, questo è super imbarazzante, ma non posso più cancellare quel post: la risposta era già al link che ho fornito con la risposta di Richie Cotton alla fine. Scusa per aver perso tempo! Penso di aver controllato tutto e poi non vedo l’ovvio. Qualcuno potrebbe postare questo come risposta e io lo accetto. Ancora una volta mi dispiace.

 fixInNamespace(predict.ar, pos="package:stats")