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?
- Sử dụng
assignInNamespace
: xem bài đăng trên R-help. - 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")
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 đó! –
@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 ... :) –
@ 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 ;-) –