gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 07:55:56 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com