在函数/包中使用data.table(使用roxygen)

时间:2016-04-26 08:17:25

标签: r windows data.table testthat

我对R很新,但似乎这个问题与以下帖子123以及不同主题4密切相关。不幸的是,我没有足够的声誉来评论那里。我的问题是,在完成所有建议之后,代码仍然不起作用:

  1. 我包括"取决于"在描述文件中
  2. 我尝试了第二种方法,包括更改NAMESPACE (不可重现)
  3. 我创建了一个示例包 here,其中包含一小部分代码,显示的错误略有不同("J" not found in routes[J(lat1, lng1, lat2, lng2), .I, roll = "nearest", by = .EACHI]而不是'lat1' not found in routes[order(lat1, lng1, lat2, lng2, time)]
  4. 我使用控制台和R脚本测试了所有脚本。在那里,代码运行没有问题。
  5. 非常感谢您的支持!

    修改:@Roland

    1. 你是对的。 Roxygen会覆盖命名空间。您必须在函数中包含#' @import data.table。您是否理解为什么只在DESCRIPTION文件中插入Depends: data.table不起作用?这可能是文档中有用的提示,还是我错过了?
    2. 改变路线< - 路线[订单(" lat1"," lng1"," lat2"," lng2&#)具有误导性34;,"时间")]至少有点帮助,因为这条线突然没有问题了。它是否正确,在这种情况下使用data.frame顺序?我会看到我现在有多远。我会告诉你最后的结果......

2 个答案:

答案 0 :(得分:4)

回答你的问题(编辑后)。

  1. 引用R exts手册:
  2.   

    几乎总是在'Depends'中提到的包也应该从NAMESPACE文件中导入:这可以确保当其他包导入当前包时,这些包的任何所需部分都可用。

    所以你仍然应该在NAMESPACE中导入,尽管你依赖或导入data.table。

    1. order来电似乎不是您所期望的,请尝试以下方法:
    2. order("lat1", "lng1", "lat2", "lng2", "time")
      
      library(data.table)
      data.table(a=2:1,b=1:2)[order("a","b")]
      

      如果出现问题,我建议您通过编写单元测试来开始调试,以获得预期的结果。将单元测试放入包中的最基本方法是tests目录中具有stopifnot(...)调用的普通R脚本。请注意,您需要在脚本开头添加库/需要包。

答案 1 :(得分:0)

除了上面的答案之外,这还更多:我发现这真的很有用...

从文档[Hadley-description](http://r-pkgs.had.co.nz/description.html und)

此处列出的导入软件包必须存在,您的软件包才能 工作。实际上,无论何时安装软件包,这些软件包 如果尚未安装,将安装在您的计算机上 (devtools::load_all()还会检查软件包是否已安装)。

在此处添加软件包依赖项可确保将其安装。 但是,这并不意味着它会与您的 包(即library(x))。最佳做法是明确引用 使用语法package::function()到外部函数。这个 使您很容易确定哪些功能在您的外部 包。当您在 未来。

如果您使用其他软件包中的许多功能,那么 详细。此外,与 ::(大约5 $ \ mu $ s,因此只有当您致电 功能数百万次。

从文档Hadley-namespace

NAMESPACE还控制您的用户可以使用哪些外部功能 包,而不必使用::。两者都令人困惑 说明(通过“导入”字段)和名称空间(通过导入 指令)似乎与进口有关。这只是一个 不幸的名字选择。导入字段确实没有什么可做的 使用导入到名称空间中的函数:只需确保 软件包已安装时已安装。它没有功能 可用。您需要以完全相同的方式导入函数 不管包装是否附上。
... 这是我的建议:在“ DESCRIPTION”中列出该软件包,以便 安装,然后始终使用pkg::fun()明确引用它。 除非有充分的理由,否则最好明确。 编写工作要多一些,但是当您阅读时要容易得多 以后再返回代码。反之则不正确。每一个 NAMESPACE中提到的软件包还必须存在于Imports或 取决于字段。