R包范围和屏蔽

时间:2015-09-12 19:25:26

标签: r scope namespaces package

我认为这是一个简单的问题,答案可能在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;用户可能已加载的其他软件包,以避免功能命名冲突,如上所示。这种忽略行为是自动的,还是我需要特别做某事?

1 个答案:

答案 0 :(得分:2)

如果你想为&#34; [&#34;然后你应该可以使用:

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

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