3

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

  1. 我在描述文件中包含了“取决于”
  2. 我尝试了第二种方法,包括更改 NAMESPACE(不可重现)
  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 脚本测试了所有脚本。在那里,代码运行没有问题。

非常感谢您的支持!

编辑:@罗兰

  1. 你说的对。Roxygen 会覆盖命名空间。您必须包含#' @import data.table该功能。你明白吗,为什么只Depends: data.table在DESCRIPTION文件中插入是行不通的?这可能是文档中的有用提示,还是我错过了?
  2. 更改为 routes <- routes[order("lat1", "lng1", "lat2", "lng2", "time")] 会产生误导,因为这条线突然不再有问题了。是否正确,在这种情况下使用 data.frame 顺序?我会看看我现在能走多远。我会告诉你最后的结果...
4

2 回答 2

4

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

  1. 引用 R exts 手册:

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

因此,尽管您依赖或导入 data.table,但您仍然应该在 NAMESPACE 中导入。

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

order("lat1", "lng1", "lat2", "lng2", "time")

library(data.table)
data.table(a=2:1,b=1:2)[order("a","b")]

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

于 2016-04-26T13:27:50.180 回答
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(通过 Imports 字段)和 NAMESPACE(通过 import 指令)似乎都参与了导入。这只是一个不幸的名字选择。Imports 字段实际上与导入命名空间的函数无关:它只是确保在您的包安装时安装包。它不使功能可用。无论是否附加了包,您都需要以完全相同的方式导入函数。
... 这是我的建议:在DESCRIPTION中列出软件包以便安装它,然后始终明确地引用它pkg::fun(). 除非有充分的理由不这样做,否则最好是明确的。编写工作量要多一些,但是当您将来回到代码时,阅读起来会容易得多。反之则不成立。NAMESPACE 中提到的每个包也必须出现在 Imports 或 Depends 字段中。

于 2020-05-20T12:50:21.173 回答