2014-10-05 94 views
1

在R中定義新的參考類時,會出現一堆鍋爐板方法(按R約定),如lengthshow等當這些被定義的時候,它們在類的方法中調用時會大量地掩蓋類似的命名方法/函數。由於您不一定知道外部函數的名稱空間,因此無法使用package::說明符。在相同名稱的參考類方法中使用方法/函數

有沒有辦法告訴一個方法忽略它自己的方法,除非調用明確使用.self $?

實施例:

tC <- setRefClass(
    'testClass', 
    fields = list(data='list'), 
    methods = list(
    length=function() { 
     length(data) 
    } 
) 
) 

example <- tC(data=list(a=1, b=2, c=3)) 
example$length() # Will cause error as length is defined without arguments 

可選地一個可以訴諸限定S4方法的類,而不是(如參考類引擎蓋下S4類),但是這似乎是工作與參考類想法.. 。

編輯: 爲了避免集中在情況下,您預先知道的數據類考慮這個例子:

tC <- setRefClass(
    'testClass', 
    fields = list(data='list'), 
    methods = list(
    length=function() { 
     length(data) 
    }, 
    combineLengths = function(otherObject) { 
     .self.length() + length(otherObject) 
    } 
) 
) 

example <- tC(data=list(a=1, b=2, c=3)) 
example$combineLength(rep(1, 3)) # Will cause error as length is defined without arguments 

我知道有可能將自己的調度寫入正確的方法/函數,但這似乎是這樣一種常見情況,我認爲它可能已經在方法包中解決了(usingMethods()的反向排序)

因此,我的問題是,如果以前不清楚,我很抱歉:是否有方法忽略方法定義中的引用類方法和字段,並完全依賴.self來訪問它們,以便定義方法/函數課外不掩飾?

+1

在我看來,你總是知道外國功能的命名空間。你可以從幫助頁面看到它。在你的例子中'base :: length(data)'就足以使它工作。 – nicola 2014-10-05 06:48:04

+0

在知道輸入是列表的情況下,是的。但想象一下用戶提供數據的情況,即長度不在其中一個字段上調用,因此您不知道傳入的內容。您可能允許一種方法接受在不同包中定義的幾個不同對象。爲了使用'::',你需要檢查對象並進行手動調度 - R通常會爲你做。 – ThomasP85 2014-10-05 07:10:55

+0

@ ThomasP85你的例子並不清楚,你最後的評論也是。你正在使用類來明確地設置數據的類型(在這裏是一個列表),所以你怎麼能不知道它的類型? – agstudy 2014-10-05 07:16:01

回答

0

這個例子不是很清楚。我不知道你有什麼理由不知道你的方法的命名空間。無論如何,在這裏一對夫婦的方法來解決此問題:

  1. 您可以參考類方法Length使用不同的名稱與資本「L」,例如
  2. 你可以找到通用的動態命名空間功能。

例如:

methods = list(
    .show =function(data) { 
     ns = sub(".*:","",getAnywhere("show")$where[1]) 
     func = get("show",envir = getNamespace(ns)) 
     func(data) 
    }, 
    show=function() { 
     .show(data) 
    } 
) 
  • 可以使用新的參考類系統R6
  • 例如:

    tC6 <- R6Class('testClass', 
        public = list(
        data=NA, 
        initialize = function(data) { 
         if (!missing(data)) self$data <- data 
        }, 
        show=function() show(self$data) 
    ) 
    ) 
    
    相關問題