【问题标题】:R external interfaceR 外部接口
【发布时间】:2012-12-21 01:38:08
【问题描述】:

我想实现一些 R 包,用 C 代码编写。

C 代码必须:

  • 将一个数组(任何类型)作为输入。
  • 生成数组作为输出(大小不可预测)。

实现数组传递的最佳实践是什么?

目前使用.C() 调用C 代码。它通过指针直接从 R 访问数组。不幸的是,不能对输出做同样的事情,因为需要提前知道输出尺寸,这在我的情况下是不正确的。

通过文件将数组从 C 传递到 R 是否有意义?比如在ramfs中,如果使用linux?

更新 1: Here 讨论了完全相同的问题。 在那里,提到了返回未知维度数组的可能选项:

在计算数组之前但知道维度之后将外部函数一分为二。第一部分将返回维度,然后准备空数组,然后第二部分将运行并填充 R 中的数组。
在我的情况下,只有在执行整个代码后才能知道完整尺寸,因此这种方法意味着运行 C 代码两次。猜测最大数组大小也不是可选的。

更新 2: 似乎唯一的方法是使用.Call() 代替,正如电源建议的那样。这里有几个很好的例子:http://www.sfu.ca/~sblay/R-C-interface.ppt

谢谢。

【问题讨论】:

  • 阅读编写 R 扩展手册,尤其是 foreign language interfaces 部分。
  • 为了将 C 和 C++ 函数与 R 接口,还可以考虑 Rcpp 包,许多人发现它比 R 基础中的 .C().Call() 函数更简单、更健壮。可以在 StackOverflow 以及从 Rcpp 包页面链接的 Eddelbuettel 和 Francois 的网站上找到许多有用的问题和答案。
  • R 编程问题属于 StackOverflow - R 统计问题属于这里!已标记为模组移动它。
  • 其他一些可供参考的资源:Hadley Wickham 最近的 guide on the .C interface、较早的 guide on the .Call interface (pdf) 以及提供 Rcpp 包示例的 RcppExamples package

标签: c r


【解决方案1】:

实现数组传递的最佳实践是什么?

软件包是否已经用 ANSI C 编写? .C() 会变得又快又容易。

如果您是从头开始编写,我建议使用 .Call() 和 Rcpp。通过这种方式,您可以将 R 对象传递给您的 C/C++ 代码。

通过文件传递数组有意义吗?

没有

阅读“编写 R 扩展”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    相关资源
    最近更新 更多