Я думаю, что это простой вопрос, и ответ, вероятно, находится где-то в книге Хэдли или официальной документации 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
?
редактировать: Для того, чтобы уточнить, я хочу, чтобы определить функцию внутри пакета таким образом, что она «игнорирует» другие пакеты пользователя, загруженные для того, чтобы избежать функций конфликтов имен, как один показано выше , Является ли это игнорирование поведения автоматическим, или мне нужно что-то делать в частности?
Если ваша функция в пакете или глобальной или обеих? – csgillespie
@csgillespie это в пакете. Я просто использовал глобальную область, чтобы продемонстрировать проблему. – shadowtalker
'[' generic, он будет смотреть на класс объекта. Если это data.table, он попытается вызвать '[.data.table'. Если это то, что вы хотите, вы должны явно импортировать его в DESCRIPTION и NAMESPACE. Если вы этого еще не сделали, '' 'будет искать метод' .data.table' в пути поиска пользователя, и в этом случае могут возникнуть непредсказуемые результаты. Если в пути поиска нет соответствующего метода 'data.table', он будет по умолчанию' data.frame' (поскольку 'data.table' наследует от' data.frame') – baptiste