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

3

我对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脚本测试了所有脚本。在那里,代码可以正常运行。

非常感谢您的支持!

编辑:@Roland

  1. 你是对的。Roxygen会覆盖命名空间。您必须在函数中包含#' @import data.table。您明白为什么只在DESCRIPTION文件中插入Depends: data.table不起作用吗?这可能是文档中有用的提示,还是我错过了它?
  2. 更改为routes <- routes[order("lat1", "lng1", "lat2", "lng2", "time")]至少有点帮助,因为这一行突然不再是问题了,这很误导人。在这种情况下,是否正确使用data.frame order?我将看看我现在能走多远。我会告诉你最终结果...

  1. 将data.table添加到Imports中(而不是Depends);2)在NAMESPACE文件中添加import(data.table)。就这样。您可能正在使用roxygen2,它可能会重写您的NAMESPACE文件?
- Roland
如果你还没有阅读过的话:R-exts手册 - jangorecki
2个回答

4

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

  1. 引用 R 扩展手册:

几乎总是在“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 目录中的普通 R 脚本,其中有 stopifnot(...) 调用。请注意,在脚本开头需要加载您的包。

好的。这意味着答案1. 这里(https://dev59.com/GWkv5IYBdhLWcg3wiRWo)不正确吗?现在`order`的问题已经解决了。我只是想知道原因是否是因为(我没有改变NAMESPACE!)它是一个data.frame order函数。我是正确的吗? - Christoph
@Christoph 如果你在data.table中使用它,那么据我所知,它不是一个基本的排序方式,除非你在data.table选项中关闭优化或直接调用base::order - jangorecki
请注意,在R 3.3.0中,随着基本R合并data.table order函数,它很快就会发生变化。有关更多详细信息,请参见R 3.3.0的NEWS文件 - jangorecki
它可能不反映当前 R 发布要求。我刚刚更新了它,将在 data.table FAQ 中跟进更新。 - jangorecki
让我们在聊天中继续这个讨论 - Christoph
显示剩余2条评论

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(通过导入指令)似乎都涉及到导入。这只是一个不幸的命名选择。Imports 字段与导入到命名空间中的函数实际上没有任何关系:它只是确保在安装您的包时安装了该包。它并不使函数可用。您需要以完全相同的方式导入函数,无论包是否已连接。
... 这是我推荐的做法:在 DESCRIPTION 中列出包,以便安装它,然后始终使用 pkg::fun() 显式地引用它。除非有充分的理由不这样做,否则最好明确。写起来可能会多一点工作,但当您将来回到代码时,阅读起来会更容易。反之则不成立。NAMESPACE 中提到的每个包也必须存在于 Imports 或 Depends 字段中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接