2013-08-26 25 views
6

Lấy hàm names: đó là hàm primitve trong R. Đối với hàm nguyên thủy, tạo chung S4 chung, do đó có thể xây dựng phương thức S4 cho hàm đó.Thêm đối số thừa vào hàm chung chung S4 cho hàm nguyên thủy

Tham dự một lớp S4 quy định như sau:

setClass("aClass", 
     representation=list(
      values = "character", 
      id = "numeric" 
      ), 
     prototype=list(
      values = character(0), 
      id = numeric(0)), 
     validity=function(object){ 
      length([email protected])==length([email protected]) 
     } 
     ) 

Bây giờ tôi muốn tạo một hàm để trích xuất các tên, hoặc sắp xếp hoặc không được phân loại. Tôi muốn làm điều này bằng cách sử dụng hàm names để tránh phải tạo một hàm mới getNames() hoặc bất kỳ thứ gì, vì điều đó ít trực quan hơn.

Sau đây là một ý tưởng về những gì cần phải được thực hiện:

setMethod("names",signature="aClass", 
    function(x,ordered=TRUE){ 
     if(ordered) 
     [email protected][[email protected]] 
     else 
     [email protected] 
    } 

này sẽ không làm việc, như names là một chức năng nguyên thủy và ordered không phải là một cuộc tranh cãi cho ngầm chung.

Làm thế nào tôi có thể làm cho công việc này theo những điều kiện sau:

  • các names chức năng nên giữ thái độ ban đầu của nó cho tất cả các đối tượng khác, trong đó có các đối tượng từ các gói khác.
  • mã phải được chấp nhận để sử dụng trong gói
  • mã phải được chấp nhận bởi các tiêu chuẩn cao được đặt bởi ví dụ: Bioconductor.

Trả lời

5

Các generic có sẵn như là

> getGeneric("names") 
standardGeneric for "names" defined from package "base" 

function (x) 
standardGeneric("names", .Primitive("names")) 
<environment: 0x459c9c0> 
Methods may be defined for arguments: x 
Use showMethods("names") for currently available ones. 

nên từ chữ ký bạn có thể thấy rằng các câu trả lời ngắn gọn là bạn không thể thêm đối số. Bạn chắc chắn không muốn tạo chức năng của riêng bạn names. Một hack sẽ sử dụng một biến toàn cầu gói getOption("pkg_names_ordered") nhưng tôi sẽ không tự mình tham gia giải pháp đó.

Trong một số cách, hợp đồng được đặt ra bởi names không nói bất kỳ điều gì về trật tự (ví dụ: tên và số không phân biệt thường được sử dụng để tập hợp con) là chỉ số cho tên được đặt hàng hoặc tên không có thứ tự?) bạn đang thực sự đề xuất một generic mới anyway.

+0

Cảm ơn câu trả lời, nhưng đó là những gì tôi đã nói trong câu hỏi của mình: Tôi không thể sử dụng đối số thừa. Các chỉ số bằng số cho các tên được đặt hàng và một bộ các khe khác (đối tượng thực tế phức tạp hơn nhiều và không phải tất cả các khe có thể được đặt hàng). Tôi sử dụng một khe phụ để cho biết liệu đối tượng đã được đặt hàng hay chưa. Tôi có một chặng đường dài xung quanh để "unorder" tên theo thứ tự. Nhưng tôi hy vọng sẽ tìm được cách để làm điều này mà không cần phải hack. Một biến toàn cầu gói là loại hack mà tôi thậm chí sẽ không xem xét một tùy chọn hợp lệ. :) –

+2

Có từ câu hỏi của bạn có vẻ như bạn biết câu trả lời là không, nhưng kể từ khi bạn hỏi câu hỏi, tôi đã trả lời;) –

+0

Tôi hy vọng có một số cách xung quanh tôi đã không nhận thức được, nhưng tôi sợ tôi ' sẽ phải giải quyết với một "không" :) Tôi cho nó một vài ngày nữa, và sau đó bạn có câu trả lời được chấp nhận của bạn. –

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