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 并将其作为边缘情况捕获?
我认为这是一个简单的问题,答案可能在 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 并将其作为边缘情况捕获?