2012-01-05 29 views
27

Tôi về cơ bản muốn thay đổi chức năng không hiển thị của gói. Đối với chức năng nhìn thấy được, ví dụ: chức năng mà không có Asterix khi methods được gọi vào chúng, tôi thấy hai bài viết làm thế nào tôi có thể đạt được mục tiêu của tôi:Làm cách nào để ghi đè lên một hàm không hiển thị trong không gian tên gói?

  1. Sử dụng assignInNamespace: xem bài đăng trên R-help.
  2. Sử dụng fix: xem bài đăng trên stackoverflow

Mặc dù cả hai cách tiếp cận công việc cho một chức năng/có thể nhìn thấy xuất khẩu (tôi sử dụng predict.lm làm ví dụ thêm dưới đây để biết cách tiếp cận thứ hai và thử nghiệm các phương pháp tiếp cận đầu tiên với chức năng subset.data.frame), chúng không hoạt động với một chức năng không nhìn thấy được, ví dụ predict.ar. Tại sao vậy? Có cách giải quyết nào không?

Dưới đây là một ví dụ nhỏ:

Chứng tỏ rằng predict.lm có thể nhìn thấy, predict.ar không phải là:

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* 

Áp dụng 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 

Thay đổi predict.lm bằng cách nhập mèo ("Dòng đầu tiên được thay đổi cho predict.lượng \ n") ở đầu phần thân hàm. (Bạn phải làm điều đó bằng tay trong trình soạn thảo):

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 

Áp dụng predict.ar:

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

Cố gắng thay đổi 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 

Cố gắng sử dụng assignInNamespace để thay thế. (Lưu ý rằng tôi chỉ cần sao chép các chức năng stats:::predict.ar trong một biên tập viên và thêm vào dòng cat("First line changed for predict.ar\n") vào đầu của cơ thể. Bởi vì cơ quan chức năng là khá lâu, tôi chỉ hiển thị các cặp vợ chồng đầu tiên của dòng ở đây)

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 

Kể từ "Dòng đầu tiên được thay đổi cho predict_biến.ar" thực sự được in trên bảng điều khiển, predict định.bị phải được thay đổi. Tuy nhiên, tại sao đối tượng 'C_artoma' không tìm thấy nữa?

CẬP NHẬT: OK, điều này thật đáng xấu hổ, nhưng tôi không thể xóa bài đăng đó nữa: Câu trả lời đã có tại liên kết mà tôi đã cung cấp với câu trả lời của Richie Cotton vào cuối. Xin lỗi vì làm mất thời gian của bạn! Tôi nghĩ rằng tôi đã kiểm tra mọi thứ và sau đó tôi không thấy rõ ràng. Ai đó chỉ có thể đăng bài này như một câu trả lời, tôi chấp nhận nó. Xin lỗi lần nữa.

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

Trả lời

21

Sử dụng fixInNamespace. :)

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

hoặc

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

(Vài năm sau ...)
Từ bình luận của Nicholas H: nếu bạn muốn đẩy một số mã vào CRAN phụ thuộc vào chức năng nội bộ từ gói khác, nó sẽ ném một cảnh báo xây dựng và bị từ chối bởi R-core. Nếu bạn muốn có chức năng nội bộ đó, bạn chỉ cần lấy một bản sao của nó bằng cách sử dụng toán tử ::: và duy trì nó.

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

OK, tôi khá giận bản thân mình vì không kiểm tra mọi liên kết chính xác một lần nữa trước khi đăng bài (stackoverflow thực sự cần tùy chọn xem trước và tùy chọn để downvote chính mình ...), nhưng bạn thực sự là người cho câu trả lời đúng chỉ làm cho ngày của tôi. Cảm ơn vì điều đó! –

+7

@Christoph_J Tôi đang cung cấp dịch vụ bỏ phiếu cho một khoản phí. Nếu bạn quan tâm ... :) –

+0

@ RomanLuštrik Haha, tốt nhất. Tôi sẽ nghĩ về nó và cho bạn biết sớm nếu tôi quan tâm ;-) –

Các vấn đề liên quan