data.table在一个包函数中不起作用。

3

我将我创建的一个函数放入了一个R包中后,它停止工作了。我收到了以下错误信息:

Error in `:=`((value), 1) : 
Check that is.data.table(DT) == TRUE. Otherwise, := and `:=`(...) are defined for use in j, once only and in particular ways. See help(":=").

奇怪的是,如果我将函数加载到环境中,而不是从包中加载,它就能正常工作?这似乎是非常奇怪的行为... 我甚至在函数中检查了是否是data.table,以防止出现这种情况!

data = as.data.table(mtcars)

# I Go into the package, highlight the function and run the code, to load the function into the environment  
# This works
create_dummy_var(data, var="cyl")

# This doesn't work (get the error message from above)
myPackage::create_dummy_var(data, var="cyl")

原始的整个函数

#' Converts a variable into a dummy variable
#'
#' Converts a single variable which contains a limited number of values into numeous dummary variables,
#' of 1 if the value is present 0 otherwise. The number of createds vars is equal to the number of unique observations in the varaiable
#'
#' @param dtable A data.table (must be data.table NOT data.frame or tibble)
#' @param var The variable to operate on
#'
#' @return data.table
#' @export
#'
#' @examples
#' 
#' df = data.frame("alp" = c("a", "a", "b", "d", "b"), "adults" = 1:5)
#' 
#' dt = data.table::data.table(df)
#' 
#' create_dummy_var(dt, "alp")
create_dummy_var <- function(dtable, var) {
  
  if (!var %in% names(dtable)) stop(var, " not found in dt")
  if(all(class(dtable) != "data.table")) stop("dt must be a data.table")
  
  dtable[, value := 1L]
  
  dcast(dtable , ...  ~ dtable[[var]] , value.var = "value", fill = 0, with = FALSE)
}

如果要复制,请把这个内容放入R包中(您可以使用RStudio的新项目、新包模板来获得样板)。

> packageVersion("data.table")
[1] ‘1.14.2’

3
你是否将data.table导入了该包中?#' @import data.table - Waldi
1
你有阅读过导入 data.table 的文档吗? - jangorecki
1个回答

4
感谢 jangorecki 指出导入 data.table 的教程
问题在于在 NAMESPACE 中声明了 data.table 的特殊符号。
导入 data.table 教程没有提到如果你使用 roxygen2 生成 NAMESPACE,那么你不能在 NAMESPACE 中使用 import(data.table)。但是像往常一样,优秀的 usethis 包已经解决了这个问题,通过 usethis::use_data_table() 命令可以创建所有样板,并且现在它可以工作了 :)。

我有一个类似的问题:“没有可见的全局函数定义:=”。在DESCRIPTION文件中添加了data.table(但是在Suggests下,而不是import下)。我还在我的R文件顶部添加了“#' @import data.table”。我能问一下你在哪里/如何使用“this::use_data_table()”吗? - mOna
在包根目录下运行 usethis::use_data_table() 命令。这将会添加一个 R/datatabletest-package.R 文件,其中 datatabletest 是我的示例包的名称。它还将编辑 DESCRIPTION 和 NAMESPACE 文件。请确保已安装 usethis 包。 - Joshua

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接