data.table 开发版本 v1.14.9 提供了 env 参数 - 使用 data.table 在语言上进行编程的新接口(请参阅此 vignette)。这对于在函数内部署 data.table 特别有用。我想在我实际开发的包中使用这个接口。但我无法将 data.table 开发版本导入到包中。
data.table::update_dev_pkg()
更新了 data.table 并使用新的 env 参数测试了一个函数 - 一切正常。Remotes: github::Rdatatable/data.table
添加到了描述文件中 here、here 和 hereAdditional_repositories: https://Rdatatable.gitlab.io/data.table
添加到了描述文件中这里。this和this后,我将其更改为
additional_repositories: https://github.com/Rdatatable/data.table.git
但是没有用。我不确定这些字段到底包含哪些内容才能将最新的 data.table 开发版本放入我的包中。
以下函数根据部署到数据文件 (.dtt) 的定义文件 (.lbl) 将数字代码替换为字符值。
# libraries (for interactive use only, do not deploy inside package)
data.table::update_dev_pkg()
library(purrr)
library(data.table)
# function (use this inside the package)
make_labels <-
function(.dtt,.lbl){
f <-
function(.dtt,clm,val,lbl){
.dtt[
,clm := as.character(clm)
,env = list(clm=clm)
][
clm == val
,clm := lbl
,env = list(clm=clm,val=val,lbl=I(lbl))
]
}
purrr::pwalk(.lbl,f,.dtt)
}
#sample data
dtt <-
data.table::data.table(
v1 = rep(1:2,5)
,v2 = rep(1:5,2)
)
lbl <-
data.table::data.table(
clm = c(rep("v1",2),rep("v2",5))
,val = c(1:2,1:5)
,lbl = letters[1:7]
)
#deploy function
make_labels(dtt,lbl)
当函数以交互方式加载时,这可以正常工作,没有任何抱怨。然而,当...
NAMESPACE
文件导入机制导入(通过将 Remotes: github::Rdatatable/data.table
添加到描述文件),随后devtools::load_all()
加载R 抛出以下错误:
> make_labels(dtt,lbl)Error in `pmap()`:
ℹ In index: 1.
Caused by error:
! Check that is.data.table(DT) == TRUE. Otherwise, :=, `:=`(...)
and let(...) are defined for use in j, once only and in particular
ways. See help(":=").
Run `rlang::last_trace()` to see where the error occurred.
我自己找到了解决方案。以下步骤可以使错误消失:
Remotes: Rdatatable/data.table
放入描述文件。这样包会自动从github导入data.table开发版本(不需要在DESCRIPTION文件中显式声明github,这是默认的)。#' @import data.table
放在函数文件顶部并执行devtools::document()
。这样 roxygen 会自动将 library(data.table)
添加到 NAMESPACE 文件中。我最终通过阅读有关将 data.table 导入到包中的 data.table 小插图(here)以及有关该主题的两个 stackoverflow-posts(here 和 here)找到了解决方案。
我之前在包中成功使用了 data.table,所以我认为错误(完全)基于将开发版本加载到包中,但事实上存在第二个问题:通过 roxygen 丢失 NAMESPACE 条目。