data.table := 不在包函数中工作

data.table := not working in a package function

我将我创建的一个函数移到了 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’

感谢 jangorecki 指出 Importing data.table vignette

问题是在 NAMESPACE 中声明 data.table 的特殊符号。

Importing data.table 小插图没有提到如果您使用 roxygen2 生成 NAMESPACE,则不能在 NAMESPACE 中使用 import(data.table)。但是一如既往,出色的 usethis 包已经涵盖了 usethis::use_data_table()。这将创建所有样板文件,现在可以使用了:)