2011-08-25 23 views
5

Tôi đang cố gắng hiểu một số mã mà tôi không viết (plot.gam trong mgcv) và có một hàm gọi hàm plot() với một số tham số lạ mà tôi không nhận ra (ví dụ: "P") . Tôi muốn tìm ra phương pháp cốt truyện nào đang được gửi đi trong cuộc gọi này. Hàm findMethod() và các hàm tương tự không giúp ích gì (tôi nghĩ cốt truyện là S3). Tôi đã thử các thư viện gỡ lỗi, nhưng điều đó không cho phép bạn "bước vào" một cuộc gọi chức năng (và cũng không phải các chức năng gỡ lỗi cơ sở).Trong R, cách tìm ra phương thức nào được gửi đi cho một cuộc gọi chức năng cụ thể?

Có cách nào để giám sát tất cả các cuộc gọi chức năng và phương thức liên kết của chúng gửi đi trong R không? Hoặc có lẽ một chức năng mà tôi có thể vượt qua một chuỗi có chứa các cuộc gọi chức năng thực tế (không chỉ là chữ ký) mà sẽ cho tôi biết những gì phương pháp được gửi đi?

+0

Chỉ cần qua một bên. . . khi chỉ định các tham số trong một hàm gọi, bạn có thể cắt bớt tên của tham số thành bất kỳ thứ gì rõ ràng. Vì vậy, nếu chỉ có một tham số _starts_ với 'P' trong chữ ký, bạn có thể chỉ định tham số đó bằng' P = '. Điều này không trả lời câu hỏi của bạn, do đó lý do nó chỉ là một bình luận. – adamleerich

Trả lời

5

Trong plot.gam() chúng tôi lưu ý rằng plot() được kêu gọi x$smooth[[i]], mà là một đối tượng của lớp:

class(x$smooth[[i]]) 
[1] "tprs.smooth" "mgcv.smooth" 

một phương pháp plot() cho lớp "mgcv.smooth" và nó là thế này đang được sử dụng cho những âm mưu trong trường hợp chung. ?plot.gam đề cập rằng đây là phương pháp mặc định sử dụng cho hầu hết các smooths, nhưng có những phương pháp cụ thể đối với một số loại mịn được hỗ trợ bởi gam() (từ Chi tiết của ?plot.gam:

For smooth terms ‘plot.gam’ actually calls plot method functions 
depending on the class of the smooth. Currently random effect and 
Markov random field smooths have special methods, the rest use the 
defaults described below. 

Đối với một số lý do, methods() là không tìm thấy phương pháp này, nhưng họ vẫn tồn tại:

> mgcv:::plot.mgcv.smooth 
function (x, P = NULL, data = NULL, label = "", se1.mult = 1, 
    se2.mult = 2, partial.resids = FALSE, rug = TRUE, se = TRUE, 
    scale = -1, n = 100, n2 = 40, pers = FALSE, theta = 30, phi = 30, 
    jit = FALSE, xlab = NULL, ylab = NULL, main = NULL, ylim = NULL, 
    xlim = NULL, too.far = 0.1, shade = FALSE, shade.col = "gray80", 
    shift = 0, trans = I, by.resids = FALSE, scheme = NULL, ...) 
{ 
.... 

này có thể liên quan đến một lỗi trong methods() đó có nghĩa là plot.function không được hiển thị n trong danh sách và R hiện tại của tôi có thể không kết hợp sửa chữa đó. Phương pháp này sẽ được hiển thị bình thường và lời khuyên chung trong các tình huống như vậy là xác định lớp đối tượng (như tôi đã trình bày ở trên) và sau đó sử dụng methods() và các chức năng tương tự (ví dụ: showMethods()) để xác định xem các phương pháp cụ thể có sẵn cho lớp học hay không) của đối tượng được trả về.

+0

Vâng, đó là vấn đề của tôi - nó không hiển thị trong phương thức(). Nhưng điều này là đúng - cảm ơn! – dan

2

Đối với các lớp S3, methods("plot") sẽ cung cấp tất cả các phương pháp được xác định cho một hàm cụ thể. Như một công văn S3, cái được gọi sẽ được dựa trên lớp của đối số đầu tiên. Nhìn vào plot.gam, tôi giả định rằng phần bạn đang hỏi về bắt đầu plot(x$smooth[[i]]), vì vậy bạn cần xem lớp nào của x$smooth[[i]] là (trong đó x là đối tượng gam) để xác định phương thức plot.

Tôi không biết cách tự động làm điều này.

+0

Tôi đã thử làm chính xác điều này. Tôi biết rằng x $ mịn [[i]] là của lớp mgcv.smooth, nhưng tôi không chắc chắn làm thế nào, với một lớp S3, tôi có thể đi từ biết rằng để biết được lô() được gửi đi. Không có gì cụ thể mà nhảy ra từ một phương thức() gọi. Nếu đây là S4, thì cái gì đó giống như getMethod() và chữ ký lớp sẽ hoạt động. Nhưng tôi không biết phải làm gì với phương pháp S3.(Tôi đã kiểm tra tất cả các chức năng có thể nhìn thấy bằng tay, và không có gì nhìn đúng.) – dan

+0

Typo: 'methods', not' method'. –

+0

@Hong, cảm ơn. Đã sửa. –

0

In lớp của đối tượng từ bên trong hàm. Hoặc là hack chức năng hoặc sử dụng dấu vết().

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