【问题标题】:Foreign function calls to a different package NOTE对不同包的外部函数调用注意
【发布时间】:2014-06-10 20:22:32
【问题描述】:

我正在准备一个 R 包以提交给 CRAN。 R CMD check 给了我以下注意:

对不同包的外部函数调用:
.Fortran("cinc", ... PACKAGE = "cmprsk")
.Fortran("crstm", ... PACKAGE = "cmprsk")
见 'Writing R'的'系统和外语界面'一章 扩展手册。

我如何摆脱这个注释?我无法通过阅读本章或搜索网络找到答案。也许我错过了一些非常简单的东西。我之前用相同的代码为 R2.x 提交了包,从来没有这个问题。这是 R3.x 的新功能。

【问题讨论】:

  • 我怀疑你做不到,这是 CRAN 维护者不希望你做的事情。
  • 如果是这样的话,真的会适得其反。如果这是他们的意图,CRAN 应该明确说明并提出一些建议/解决方案。

标签: r clrpackage


【解决方案1】:

警告将您指向Writing R Extensions 手册的'System and Foreign language interface' chapter,其中明确指出(在Writing Portable Packages 部分):

通过 .Internal、.C、.Fortran、.Call 或 .External 调用 R 或其他包中的已编译代码是不可移植的,因为此类接口如有更改,恕不另行通知,并且可能会导致您的代码终止R 进程。

要(可能)澄清:“在 R 或其他包中”是指“在基本 R 系统或其他包中”。 (“终止 R 进程”意味着如果您调用的函数的内容发生变化,您的代码可能会导致某人的 R 会话崩溃。)

您可以说出您喜欢 CRAN 维护者的哪些方面,但他们在技术方面很少出错,而且原因几乎总是在某处记录在案。

您的一些选择是:

  • 如果您不想提交给 CRAN,您可以忽略 NOTE。
  • 您可以从其他包中复制 Fortran(或 C)代码并将其合并到您自己的包中(您可能需要注意许可证,并且请求许可当然是礼貌的)
  • 您可以要求其他包的维护人员围绕其低级代码实施和导出一个精简的 R 包装器

【讨论】:

  • 感谢您指出注释是关于这个特定问题的。我永远也猜不到。当然,CRAN 维护者永远是对的。我只希望他们发布更具体的消息,例如“以下调用存在可移植性问题”。是的,我了解可移植性问题,但这让我没有其他选择或方法来解决这个问题。
  • 嗯,有一些可能的解决方案 - 1. 向另一个包的维护者提出请求,在两个 fortran 调用周围放置一个 R 包装器,或者 2. 获取他们的 fortran 代码并制作一个小包供我自己使用。这些解决方案都不是理想的。
  • 这条评论与我上面的建议有何不同...?
  • 那张纸条写得真糟糕。我猜这真的意味着你不应该调用其他人的编译代码,但它读起来就像你不应该调用编译代码根本(因为提到的接口是唯一的接口存在)。
  • 当你仔细阅读它时,“在 R 或其他包中”这一条款是关键 - “在 R 中”的意思是“在基本 R 系统中”(或者无论如何人们会正确/技术上正确地说)
猜你喜欢
  • 1970-01-01
  • 2020-08-13
  • 2022-08-12
  • 1970-01-01
  • 1970-01-01
  • 2018-06-12
  • 1970-01-01
  • 2013-09-11
  • 1970-01-01
相关资源
最近更新 更多