r语言 - 在函数/包中使用 data.table(使用 roxygen)



我对R很陌生,但似乎这个问题与下面的帖子1,2,3和有点不同的主题4密切相关。不幸的是,我没有足够的声誉在那里发表评论。我的问题是,在浏览了那里的所有建议后,代码仍然不起作用:

  1. 我在描述文件中包含了"依赖"
  2. 我尝试了第二种方法,包括更改命名空间 (不可重现)
  3. 我在这里创建了一个示例包,其中包含代码的一小部分,该代码显示的错误略有不同("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 脚本测试了所有脚本。在那里,代码运行没有问题。

非常感谢您的支持!

编辑:@Roland

  1. 你是对的。Roxygen 覆盖命名空间。您必须包含函数#' @import data.table。你明白吗,为什么只在描述文件中插入Depends: data.table不起作用?这可能是文档中有用的提示,还是我错过了?
  2. 成<-航线[order("lat1","lng1","lat2","lng2","time")]至少有所帮助,因为这条线路突然不再有问题,这是错误的。在这种情况下使用数据帧顺序是否正确?我会看看我现在能走多远。我会让你知道最终结果...

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

  1. 引用 R exts 手册:

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

所以你仍然应该在命名空间中导入,尽管如果你依赖或导入 data.table。

  1. order调用似乎不是您所期望的,请尝试以下操作:

order("lat1", "lng1", "lat2", "lng2", "time")
library(data.table)
data.table(a=2:1,b=1:2)[order("a","b")]

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

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

来自文档 [哈德利描述](http://r-pkgs.had.co.nz/description.html und)

此处列出的导入包必须存在,以便您的包到 工作。事实上,任何时候安装你的包,这些包 如果尚不存在,将安装在您的计算机上 (devtools::load_all()还会检查软件包是否已安装)。

在此处添加包依赖项可确保安装它。 但是,这并不意味着它将与您的一起附加 包(即库(x))。最佳做法是显式引用 到使用语法的外部函数 package::function() 。 这 可以非常容易地识别哪些功能存在于您的外部 包。当您在 前途。

如果您使用其他软件包中的许多功能,则相反 详细。还有一个轻微的性能损失与 ::(大约 5$\mu$s,所以只有当你调用 函数数百万次)。

来自文档哈德利命名空间

命名空间还控制哪些外部函数可以由您的 无需使用 :: 即可打包。令人困惑的是,两者都 描述(通过"导入"字段)和"命名空间"(通过导入) 指令)似乎涉及进口。这只是一个 不幸的名字选择。"导入"字段确实没有任何内容 使用导入到命名空间中的函数:它只是确保 包在包安装时安装。它不使函数 可用。您需要以完全相同的方式导入函数 无论是否附加了包裹。
... 这是我的建议:在描述中列出包,以便它是 已安装,然后始终使用 pkg::fun() 显式引用它。 除非有充分的理由不这样做,否则最好明确。 写起来要多一点,但当你阅读时要容易得多 以后回到代码。反之则不然。每 命名空间中提到的包也必须存在于导入或 取决于字段。