我認爲這是一個簡單的問題,答案可能在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
中搜索?
編輯:爲了澄清,我想以這樣的方式,它「忽略」用戶可能已經加載其他包定義包內部功能,爲了避免函數命名衝突,如一個以上的證明。這是忽略行爲自動,還是我需要做一些特別的事情?
如果你的函數在包或者全局或者兩者都有? – csgillespie
@csgillespie它在包中。我只是用全球範圍來展示問題。 – shadowtalker
'['是泛型的,它會查看對象的類。如果它是一個data.table,它會嘗試調用一個'[.data.table'。如果這就是你想要發生的事情,你應該在DESCRIPTION和NAMESPACE中明確地導入它。如果你還沒有這樣做,'['會在用戶的搜索路徑上搜索一個'[.data.table']方法,在這種情況下可能會出現不可預知的結果。如果搜索路徑沒有任何對應的'data.table'方法,它將默認爲'data.frame'(因爲'data.table'繼承自'data.frame') – baptiste