2015-09-12 4 views
1

Я думаю, что это простой вопрос, и ответ, вероятно, находится где-то в книге Хэдли или официальной документации R или в ответах на Writing robust R code: namespaces, masking and using the `::` operator, но я еще не встретил ее (или не помните про чтение об этом).R scope scope и маскировка

Допустим, я хочу написать пакет, содержащий функцию:

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 даже не будет доступен для моего р ackage, если я явно не указал import, и в этом случае эта проблема не может произойти в пакете так, как это может произойти в глобальной среде. Это правда? Если нет, как я могу справиться с этим видом маскировки?

Редактировать 2: Функция sort_by_column определена в упаковке A. Другой пакет, B был загружен перед пакетом A, но явно не импортирован A. Выполняют ли звонки из функций, определенных в A, в пакете B?

редактировать: Для того, чтобы уточнить, я хочу, чтобы определить функцию внутри пакета таким образом, что она «игнорирует» другие пакеты пользователя, загруженные для того, чтобы избежать функций конфликтов имен, как один показано выше , Является ли это игнорирование поведения автоматическим, или мне нужно что-то делать в частности?

+0

Если ваша функция в пакете или глобальной или обеих? – csgillespie

+0

@csgillespie это в пакете. Я просто использовал глобальную область, чтобы продемонстрировать проблему. – shadowtalker

+0

'[' generic, он будет смотреть на класс объекта. Если это data.table, он попытается вызвать '[.data.table'. Если это то, что вы хотите, вы должны явно импортировать его в DESCRIPTION и NAMESPACE. Если вы этого еще не сделали, '' 'будет искать метод' .data.table' в пути поиска пользователя, и в этом случае могут возникнуть непредсказуемые результаты. Если в пути поиска нет соответствующего метода 'data.table', он будет по умолчанию' data.frame' (поскольку 'data.table' наследует от' data.frame') – baptiste

ответ

2

Если вы хотите, чтобы указать конкретный метод «[», то вы должны быть в состоянии использовать:

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

Или тест на data.tables с использованием inherits и ловушки, как крайний случай?