2012-01-05 16 views
27

Temel olarak bir paketin görünmeyen işlevini değiştirmek istiyorum.Paket ad alanında görünmeyen bir işlevi nasıl geçersiz kılarım?

  1. Kullanım assignInNamespace: R-help üzerine yayını görebilen görünür işlevler için methods üzerlerinde çağrıldığında hiçbir, Yıldız var yani fonksiyonları, benim hedefe ulaşmak nasıl iki mesajları bulundu.
  2. kullanımı fix: her ikisi de verilen/görünür fonksiyonu (I ayrıca, ikinci bir yaklaşım, aşağıda örnek olarak predict.lm kullanım ve fonksiyon subset.data.frame ilk yaklaşım test) için hangi yaklaşımın da, stackoverflow

yayınına bakın Görünmeyen bir işlev için çalışmıyorlar, örneğin predict.ar. Neden? Bir çözüm var mı? İşte

minimal örnektir: görünür predict.lm

Show predict.ar değildir: kedi girerek

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 

Değişim predict.lm:

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* 

predict.lm uygula ("İlk satır, predict.lm \ n" için) işlev işlevinin başlangıcında olarak değiştirildi. (Sen editörü elle yapmak zorunda):

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 

predict.ar uygula:

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

deneyin predict.ar değiştirmek için: yerine assignInNamespace kullanmak

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 

deneyin.

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 

yana (Ben sadece işlev gövdesi oldukça uzun olduğundan, sadece burada satırları kelimenin ilk göstermektedir. Editör işlevini stats:::predict.ar kopyalanabilir ve vücudun başında hattını cat("First line changed for predict.ar\n") eklendi unutmayın) "Predict.ar" için ilk satır değişti, aslında konsola basıldı, predict.ar değiştirilmiş olmalı. Ancak, neden 'C_artoma' nesnesi artık bulunamadı?

GÜNCELLEME: Tamam, bu çok utanç verici, ancak bu yazıyı artık silemiyorum: Yanıt zaten Richie Cotton'un cevabını sağladığım bağlantıda zaten vardı. Zamanını harcadığım için üzgünüm! Sanırım her şeyi kontrol ettim ve o zaman belli olanı göremiyorum. Birisi bunu bir cevap olarak gönderebilir ve kabul ediyorum. Tekrar özür dilerim.

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

cevap

21

fixInNamespace'u kullanın. :)

fixInNamespace("predict.ar", "stats") 

veya

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

(Birkaç yıl sonra ...)
Nicholas H'nin yorumunda: eğer bir kodu başka bir paketten dahili bir işleve bağlı olarak CRAN'a göndermek istiyorsanız, bir yapı uyarısı atar ve R-core tarafından reddedilir. Bu dahili işlevi istiyorsanız, ::: operatörünü kullanarak bir kopyasını almalı ve kendiniz korumalısınız.

predict.ar <- stats:::predict.ar 
+1

Tamam, (stackoverflow gerçekten bir önizleme seçeneği ve kendini downvote seçeneği ... gerekiyor) göndermeden önce doğru tekrar her bağlantıyı kontrol etmiyor için kendime oldukça kızgınım ama aslında bir veren sen olduğunu Doğru cevap, sadece benim günüm oldu. Bunun için teşekkürler! –

+7

@Christoph_J Ücretli bir indirme hizmeti vereceğim. Eğer ilgileniyorsanız ... :) –

+0

@ RomanLuštrik Haha, iyi biri. Bunu düşüneceğim ve ilgilenirseniz yakında bilmenizi sağlayın ;-) –

İlgili konular