我在这里发布的这个问题实际上是由于服务器配置引起的。该包实际上没有与 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/