如何将github上托管的data.table开发版本导入到r包中?

问题描述 投票:0回答:1

概要

data.table 开发版本 v1.14.9 提供了 env 参数 - 使用 data.table 在语言上进行编程的新接口(请参阅此 vignette)。这对于在函数内部署 data.table 特别有用。我想在我实际开发的包中使用这个接口。但我无法将 data.table 开发版本导入到包中。

我尝试了什么

  • 我用
    data.table::update_dev_pkg()
    更新了 data.table 并使用新的 env 参数测试了一个函数 - 一切正常。
  • 我尝试通过 load_all() 在包中使用完全相同的函数 - 我收到错误。
  • 我按照建议将
    Remotes: github::Rdatatable/data.table
    添加到了描述文件中 hereherehere
  • 我按照建议将
    Additional_repositories: https://Rdatatable.gitlab.io/data.table
    添加到了描述文件中这里
  • 阅读完
    this
    this后,我将其更改为additional_repositories: https://github.com/Rdatatable/data.table.git
  • 我还阅读了 Wickham 在他的 R-packages 书中关于导入非标准依赖项的内容(请参阅this) - 他所说的内容与我在上面的远程字段中提到的观点大致相似。

但是没有用。我不确定这些字段到底包含哪些内容才能将最新的 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)

当函数以交互方式加载时,这可以正常工作,没有任何抱怨。然而,当...

  • data.table 通过
    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.
r data.table r-package
1个回答
1
投票

我自己找到了解决方案。以下步骤可以使错误消失:

  • 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(herehere)找到了解决方案。

我之前在包中成功使用了 data.table,所以我认为错误(完全)基于将开发版本加载到包中,但事实上存在第二个问题:通过 roxygen 丢失 NAMESPACE 条目。

© www.soinside.com 2019 - 2024. All rights reserved.