1
在R中定義新的參考類時,會出現一堆鍋爐板方法(按R約定),如length
,show
等當這些被定義的時候,它們在類的方法中調用時會大量地掩蓋類似的命名方法/函數。由於您不一定知道外部函數的名稱空間,因此無法使用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來訪問它們,以便定義方法/函數課外不掩飾?
在我看來,你總是知道外國功能的命名空間。你可以從幫助頁面看到它。在你的例子中'base :: length(data)'就足以使它工作。 – nicola 2014-10-05 06:48:04
在知道輸入是列表的情況下,是的。但想象一下用戶提供數據的情況,即長度不在其中一個字段上調用,因此您不知道傳入的內容。您可能允許一種方法接受在不同包中定義的幾個不同對象。爲了使用'::',你需要檢查對象並進行手動調度 - R通常會爲你做。 – ThomasP85 2014-10-05 07:10:55
@ ThomasP85你的例子並不清楚,你最後的評論也是。你正在使用類來明確地設置數據的類型(在這裏是一個列表),所以你怎麼能不知道它的類型? – agstudy 2014-10-05 07:16:01