我认为这是一个简单的问题,答案可能在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
包中搜索?
编辑:为了澄清,我想在一个包中定义一个函数,使它&#34;忽略&#34;用户可能已加载的其他软件包,以避免功能命名冲突,如上所示。这种忽略行为是自动的,还是我需要特别做某事?
答案 0 :(得分:2)
如果你想为&#34; [&#34;然后你应该可以使用:
`[.data.frame`(x, TRUE, j)
或者使用inherits
测试data.tables并将其作为边缘情况陷阱?