I'm building an R package in which I would like to use dtplyr
to perform various bits of data manipulation. My issue is that dtplyr
seems to only work if I import the whole of data.table
(i.e. using the roxygen #' @import data.table
). Without this I get errors like:
Error in .(x = sum(x), y = sum(y), :
could not find function "."
If I can solve this problem by only importing certain functions from data.table
that would be great, but there seems to be no function .()
in the package. My knowledge of data.table
is limited, but I can only assume it uses .()
to edit parsed code (similar to the base R bquote()
), but that dtplyr
for some reason needs data.table
to be loaded for this to work.
I've tried various things such as withr::with_package("data.table", code)
and requireNamespace("data.table")
, but so far importing the whole package is the only thing that seems to work. This is not a viable solution because it completely ruins the well-maintained namespace in the package I'm working on by importing so many functions from data.table
.
NB, this package houses a project which will be worked on by many other analysts well into the future. While simply writing data.table
code may be preferable in terms of performance and general good-practice, using dtplyr
to translate dplyr
code gives a boost in readability and ease-of-use that is far more important in this context.
The (documented) solution I found is to set .datatable.aware <- TRUE
somewhere in the package source code. According to the documentation, if you're using data.table
in a package without importing the whole thing, you should do this so that [.data.table()
does not revert to calling [.data.frame()
. From the docs:
...please define .datatable.aware = TRUE anywhere in your R source code (no need to export). This tells data.table that you as a package developer have designed your code to intentionally rely on data.table functionality even though it may not be obvious from inspecting your NAMESPACE file.