2013-08-26 59 views
6

函數names:這是R中的一個原始函數。對於原始函數,創建隱式S4泛型,因此可以爲該函數構造S4方法。爲函數原型隱式S4泛型添加額外參數

以定義的S4類,如下所示:

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]) 
     } 
     ) 

現在我想創建一個函數來提取的名字,無論是有序還是無序。我想用names這個功能來做到這一點,以避免必須製作一個新功能getNames()或其他的東西,因爲這不太直觀。

下面給出了需要做的事情的想法:

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

這是行不通的,因爲names是一種原始的功能和ordered是不是隱含通用的參數。

我怎樣才能使這項工作在下列條件下:

  • names功能應保持其原有的行爲所有其他對象,包括來自其他包的對象。
  • 該代碼應該可以接受用於包裝
  • 該代碼應該可以被例如Bioconductor設置的高標準接受。

回答

5

通用可作爲

> 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. 

所以從簽名,你可以看到簡單的答案是,你可以不加參數。你一定不想創建自己的功能names。黑客將使用包全局變量getOption("pkg_names_ordered"),但我不會自己參與解決方案。

在某些方面,names列出的合同沒有提及任何有關順序的內容(例如,名稱和數字indecies經常用於子集;是有序名稱的數字索引還是無序名稱?),所以無論如何,你真的提出了一個新的通用。

+0

感謝您的回答,但這就是我在我的問題中所說的:我不能使用額外的參數。數字指數是針對有序名稱和一組其他插槽(實際對象要複雜得多,並不是所有插槽都可以排序)。我使用一個額外的插槽來指示對象是否已被命令。我有很長的路要「排序」命令的名字。但我希望找到一種方法來避免黑客入侵。軟件包全局變量是我甚至不認爲有效選項的破解類型。 :) –

+2

是的,從你的問題看來,你似乎知道答案是否定的,但既然你問了這個問題,我回答了;) –

+0

我希望有一些解決辦法我沒有意識到,但是我害怕,我不得不以「不」的方式解決:)我再給它幾天,然後你有你的接受答案。 –