在foreach循环中导出函数时,C符号名称不在加载表中

时间:2015-03-17 19:58:00

标签: c r parallel-foreach

我在这里发布的这个问题实际上是由于服务器的配置。该包实际上没有与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失败 - &#34; C符号名称&#34; foo&#34;不在装载表中#34;

这是我尝试过的:

  • 添加.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符号的任何内容。

1 个答案:

答案 0 :(得分:0)

我通过创建一个包含所有带有.C的功能的软件包来解决了这个问题。 然后添加.packages =“ yourpackage”并导出所有需要的功能。