我正在创建一个 R 包,其中包含一些数据集,我希望导出这些数据集以供用户使用以及在包的函数内部使用。
例如,假设我创建了一个名为
measurements
的数据集,如下所示:
measurements <- data.frame(id = c(1:10), value = runif(10))
usethis::use_data(measurements, overwrite = TRUE)
这使得用户只需引用
measurements
就可以从外部访问测量数据帧。
现在,我还想编写一个内部使用相同数据框的封装函数:
#' fn_docalc
#'
#' @param x Value to multiply by
#'
#' @return Measurements dataframe multiplied by x
#' @export
fn_docalc <- function(x){
measurements$value <- measurements$value * x
measurements
}
这工作正常,但失败的一种情况是用户加载包,并且碰巧在全局环境中创建了自己的名为
measurements
的变量。 如果发生这种情况,则 fn_docalc
将对新的全局变量而不是包的变量进行操作。 即使存在不同的全局版本的 measurements
,如何正确编写函数/包以在调用 fn_docalc
时始终引用内部 measurements
变量?
在@NirGraham的帮助下,似乎您必须/应该显式定义所引用数据的名称空间。 在上面的示例中,以下函数定义解决了该问题:
fn_docalc <- function(x){
tmp <- myPkgName::measurements
tmp$value <- tmp$value * x
tmp
}
此外,我的实际用例是使用
get()
函数而不是直接引用变量。 在这种情况下相当于 tmp <- get("measurements")
。 解决这个问题的方法是包含 pos
参数,例如:tmp <- get("measurements", pos = "package:myPkgName")