R 包范围和屏蔽

R package scope and masking

我认为这是一个简单的问题,答案可能在 Hadley 的书或官方 R 文档中的某处,或者在 Writing robust R code: namespaces, masking and using the `::` operator 的答案中,但我还没有找到它 (或者不记得读过它)。

假设我想编写一个包含函数的包:

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 甚至不能用于我的包,除非我明确地 import 它,在这种情况下,这个问题不会像它那样发生在包中发生在全球环境中。真的吗?如果没有,我该如何处理这种屏蔽?

编辑 2:函数 sort_by_column 在程序包 A 中定义。另一个包 B 在包 A 之前加载,但未由 A 显式导入。来自 A 中定义的函数的调用是否在包 B 中搜索?

编辑:为了澄清,我想在一个包中定义一个函数,这样它"ignores"用户可能已经加载的其他包,以便以避免像上面演示的那样的函数命名冲突。这种忽略行为是自动的,还是我需要做一些特别的事情?

如果你想为“[”指定一个特定的方法,那么你应该能够使用:

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

或者使用 inherits 测试 data.tables 并将其作为边缘情况捕获?