2014-05-24 21 views
6

Có ai xếp chung/tìm phương pháp tốt để liệt kê tất cả các phương thức S3 có sẵn cho một đối tượng nhất định? Hàm methods() dựng sẵn sẽ cung cấp tất cả các phương thức có sẵn cho một lớp được chỉ định, hoặc cho một hàm chung được chỉ định, nhưng không cho một đối tượng.có chức năng trả về tất cả các phương pháp S3 áp dụng cho một đối tượng

Ví dụ tôi có trong tâm trí là một đối tượng glm, mà là của lớp "glm" (nhỏ?) Mà còn được thừa hưởng từ "lm"

g <- glm(y~x,data=data.frame(x=1:10,y=1:10)) 
class(g) 
## [1] "glm" "lm" 

Có 35 phương thức của lớp "lm" và 22 cho "GLM ". Tôi quan tâm đến một câu trả lời mà kết hợp các kết quả của

lapply(class(g),function(x) methods(class=x)) 

một cách hợp lý, vì vậy mà tôi có thể thấy ngay (ví dụ) rằng có một phương pháp cụ thể glm cho add1, nhưng đó là phương pháp cho alias được kế thừa từ lớp lm.

Có ai đó có cách khéo léo để thực hiện việc này hay không?

PS Steve Walker's S3-S4-reference class glossary cho thấy rằng công trình này tự động hoạt động cho các lớp tham chiếu, nơi chúng tôi phải sử dụng một đối tượng để lấy các phương pháp (x$getRefClass()$methods()).

+1

Một chút sai lầm khi yêu cầu các phương thức của một lớp S3, vì trong S3 các hàm của nó có các phương thức chứ không phải các lớp. – hadley

Trả lời

4

Dưới đây là một nỗ lực để nhân rộng các hành vi "tiêu chuẩn"

classMethods <- function(cl) { 
    if(!is.character(cl)) { 
     cl<-class(cl) 
    } 
    ml<-lapply(cl, function(x) { 
     sname <- gsub("([.[])", "\\\\\\1", paste0(".", x, "$")) 
     m <- methods(class=x) 
     data.frame(
      m=as.vector(m), 
      c=x, n=sub(sname, "", as.vector(m)), 
      attr(m,"info"), 
      stringsAsFactors=F 
     ) 
    }) 
    df<-do.call(rbind, ml) 
    df<-df[!duplicated(df$n),] 
    structure(df$m, 
     info=data.frame(visible=df$visible, from=df$from), 
     class="MethodsFunction") 
} 

Và sau đó bạn có thể hãy dùng thử với

g <- glm(y~x,data=data.frame(x=1:10,y=1:10)) 
classMethods(g) 
#or classMethods(c("glm","lm")) 

và điều đó sẽ trả lại

[1] add1.glm*   anova.glm   confint.glm*  cooks.distance.glm* 
[5] deviance.glm*  drop1.glm*   effects.glm*  extractAIC.glm*  
[9] family.glm*   formula.glm*  influence.glm*  logLik.glm*   
[13] model.frame.glm  nobs.glm*   predict.glm   print.glm   
[17] residuals.glm  rstandard.glm  rstudent.glm  summary.glm   
[21] vcov.glm*   weights.glm*  alias.lm*   case.names.lm*  
[25] dfbeta.lm*   dfbetas.lm*   dummy.coef.lm*  hatvalues.lm  
[29] kappa.lm   labels.lm*   model.matrix.lm  plot.lm    
[33] proj.lm*   qr.lm*    simulate.lm*  variable.names.lm* 

    Non-visible functions are asterisked 

Nó không phải là thanh lịch hoặc ngắn như Josh, nhưng tôi nghĩ rằng nó là một giải trí tốt về hành vi mặc định. Thật buồn cười khi thấy rằng hàm methods chính nó chỉ là một grep trên tất cả các tên hàm đã biết. Tôi đã mượn công cụ gsub từ đó.

4

Dưới đây là một chức năng mà ít nhất sẽ cho bạn biết phương pháp S3 một đối tượng ban đầu sẽ kích hoạt:

findMethodsS3 <- function(object) { 
    x <- unlist(lapply(class(object),function(x) methods(class=x))) 
    sort(x[!duplicated(tools::file_path_sans_ext(x))]) 
} 

findMethodsS3(g) 
# [1] "add1.glm"   "alias.lm"   "anova.glm"   
# [4] "case.names.lm"  "confint.glm"  "cooks.distance.glm" 
# [7] "deviance.glm"  "dfbeta.lm"   "dfbetas.lm"   
# [10] "drop1.glm"   "dummy.coef.lm"  "effects.glm"  
# [13] "extractAIC.glm"  "family.glm"   "formula.glm"  
# [16] "hatvalues.lm"  "influence.glm"  "kappa.lm"   
# [19] "labels.lm"   "logLik.glm"   "model.frame.glm" 
# [22] "model.matrix.lm" "nobs.glm"   "plot.lm"   
# [25] "predict.glm"  "print.glm"   "proj.lm"   
# [28] "qr.lm"    "residuals.glm"  "rstandard.glm"  
# [31] "rstudent.glm"  "simulate.lm"  "summary.glm"  
# [34] "variable.names.lm" "vcov.glm"   "weights.glm"  
+0

'công cụ :: file_path_sans_ext' là một hack rất dễ thương ... –

+0

Đó là tên phức tạp dễ nhớ nhất đối với hàm R mà tôi biết. Nhớ rằng nó có trong 'utils' hay' tools' là thứ thường mang lại cho tôi ... –

+1

Điều đó chỉ hoạt động chừng nào tên lớp không có "." trong đó, phải không? – MrFlick

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