3

我在这里发布的这个问题实际上是由于服务器的配置造成的。该软件包实际上没有与 R/C 相关的问题。

我正在使用 foreach 开发一个 R 包来加速计算。为了说明包的结构,我在下面给出一个简化的 R 脚本和一个 C 文件:

f3.R:

f3 = function(.lst){
  cl <- makeCluster(2)
  registerDoParallel(cl)
  
  f1 <-function(x){
    tmp <- .C("foo")
    x
  }
  
  f2 <-function(x){
    f1(x)
  }
  
  foreach(x=.lst, .verbose = TRUE ) %dopar% {
  f2(x)
  
  }
}

foo.c

#include <stdio.h> 
#include <R.h> 

extern "C" {
  void foo() {
    ;
  }
}

这个包在 Mac OS 上运行得很好,但是会抛出错误信息

自动从本地环境中导出以下变量:f1、f2

numValues:1,numResults:0,停止:TRUE

得到任务 1 的结果

累积得到错误结果

numValues:1,numResults:1,停止:TRUE

由于错误未调用组合函数

返回状态 TRUE

{ 中的错误:任务 1 失败 - “C 符号名称“foo”不在加载表中”

这是我尝试过的:

  • 补充.export = c("foo"):没有帮助
  • 移动f1()f2()一个单独的 R 脚本并添加.export = c("f1", "f2"):也可以在 Mac OS 上工作,但在 linux 上没有帮助
  • 如果我不构建包,而是直接将上面的函数加载到内存中,那么它可以在 Mac OS 和 Linux 上运行
  • 如果没有调用 C 函数(请注意,在我的示例中,C 代码什么也没做),那么它可以在 Mac OS 和 Linux 上运行。但是,如果我移动f1()f2()分离 R 脚本并添加.export = c("f1", "f2"),它会再次在 Linux 上失败。

从互联网上找到的大多数帖子都建议使用.export导出 R 函数,但我没有找到任何关于导出 C 符号的信息。

4

1 回答 1

0

我通过创建一个包含所有带有 .C 的函数的包来解决这个问题。然后添加 .packages = "yourpackage" 并导出所需的所有功能。

于 2020-09-03T23:41:47.377 回答