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

标签 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 上运行良好,但会抛出错误消息

automatically exporting the following variables from the local environment: f1, f2

numValues: 1, numResults: 0, stopped: TRUE

got results for task 1

accumulate got an error result

numValues: 1, numResults: 1, stopped: TRUE

not calling combine function due to errors

returning status TRUE

Error in { : task 1 failed - "C symbol name "foo" not in load table"

这是我试过的:

  • 添加 .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符号的信息。

最佳答案

我通过创建一个包含所有函数的包解决了这个问题,其中包含一个 .C。 然后添加 .packages = "yourpackage"并导出所有需要的函数。

关于在 foreach 循环中导出函数时,C 符号名称不在加载表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29108568/

相关文章:

r - ggplot2 跨组中的嵌套方面

R:检查 df 行中的任何值是否不存在于其他 df 的同一行中

r - 如何在 R 中将 `foreach` 和 `%dopar%` 与 `R6` 类一起使用?

Python 和 rpy2 : How do I adjust/clear a graphic during runtime?

r - doParallel(包)foreach 不适用于 R 中的大迭代

r - 如何在R中的并行任务中删除临时文件

c - 如何在 Ruby 1.9 C 扩展中将 Block 转换为 Proc?

c - 修改函数中结构成员指向的值

c - C 中的文件行计数器

c - fprintf C 多个空格