2015-09-12 44 views
1

我認爲這是一個簡單的問題,答案可能在Hadley的書或官方的R文檔或Writing robust R code: namespaces, masking and using the `::` operator的答案中,但我還沒有遇到過(或不記得讀過它)。R包的範圍和屏蔽

比方說,我想編寫一個包含功能包:

sort_by_column <- function(x, j) { 
    j_ord <- order(x[, j]) 
    x[j_ord, ] 
} 

如果我定義在全球環境中這個功能,我通過在x的值是一個data.table,它會悄悄地失敗因爲[就會分派到[.data.table而不是[.data.frame

library(data.table) 
sort_by_column(iris, 3) 
sort_by_column(data.table(iris), 3) 

我的直覺告訴我,[.data.table甚至不會提供給我的p除非我明確指出import這種情況,在這種情況下,這個問題不會像在全球環境中發生的那樣出現在軟件包中。真的嗎?如果不是,我該如何處理這種掩蔽?

編輯2:功能sort_by_column在包A中定義。另一個包B已在包A之前加載,但未由A明確導入。通過A定義的函數進行調用在包B中搜索?

編輯:爲了澄清,我想以這樣的方式,它「忽略」用戶可能已經加載其他包定義包內部功能,爲了避免函數命名衝突,如一個以上的證明。這是忽略行爲自動,還是我需要做一些特別的事情?

+0

如果你的函數在包或者全局或者兩者都有? – csgillespie

+0

@csgillespie它在包中。我只是用全球範圍來展示問題。 – shadowtalker

+0

'['是泛型的,它會查看對象的類。如果它是一個data.table,它會嘗試調用一個'[.data.table'。如果這就是你想要發生的事情,你應該在DESCRIPTION和NAMESPACE中明確地導入它。如果你還沒有這樣做,'['會在用戶的搜索路徑上搜索一個'[.data.table']方法,在這種情況下可能會出現不可預知的結果。如果搜索路徑沒有任何對應的'data.table'方法,它將默認爲'data.frame'(因爲'data.table'繼承自'data.frame') – baptiste

回答

2

如果要指定一個特定的方法「」那麼你應該能夠使用:

`[.data.frame`(x, TRUE, j) 

或測試使用inherits和陷阱,作爲一個邊緣的情況下data.tables?