首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何评估R包中动态库中的C函数?

如何评估R包中动态库中的C函数?
EN

Stack Overflow用户
提问于 2018-10-30 05:47:46
回答 1查看 90关注 0票数 2

我正在尝试在一个R包中实现并行计算,该包使用.C函数从R调用C。集群的节点似乎不能访问动态库。我做了一个并行socket集群,如下所示:

cl <- makeCluster(2)

我想使用R包parallel中的clusterEvalQ在集群中的每个节点上评估R包中名为valgrad的C函数。但是,我的代码产生了一个错误。我编译了我的包,但是当我运行

out <- clusterEvalQ(cl, cresults <- .C(C_valgrad, …))

其中,表示C函数valgrad中的参数。我得到了这个错误:

Error in checkForRemoteErrors(lapply(cl, recvResult)) : 
  2 nodes produced errors; first error: object 'C_valgrad' not found

我怀疑clusterEvalQ访问动态库的能力有问题。我尝试通过使用以下命令将glmm包加载到集群中来修复此问题

clusterEvalQ(cl, library(glmm))

但这并没有解决问题。

我可以使用foreach R包中的foreach函数评估每个集群上的valgrad,如下所示:

out <- foreach(1:no_cores) %dopar% {.C(C_valgrad, …)}

no_cores是集群中的节点数。但是,此函数不允许在集群的任何后续计算中访问valgrad的任何计算结果。

我怎么才能

(1)使valgrad的评估结果可供集群上的后续计算使用,或者

(2)使用clusterEvalQvalgrad进行评估

EN

回答 1

Stack Overflow用户

发布于 2018-10-30 06:09:09

您必须加载外部库。但这不是通过library调用完成的,而是通过dyn.load完成的。

以下两个函数非常有用如果您使用多个操作系统,它们使用内置变量.Platform$dynlib.ext

还要注意unload函数。如果您开发一个C函数库,您将需要它。如果您在测试之前更改了一个C函数,则必须卸载动态库,然后重新加载(新版本)。

请参阅编写R Extensions,文件R-exts.pdf,位于文档文件夹的第5节或CRAN上。

dynLoad <- function(dynlib){
    dynlib <- paste(dynlib, .Platform$dynlib.ext, sep = "")
    dyn.load(dynlib)
}

dynUnload <- function(dynlib){
    dynlib <- paste(dynlib, .Platform$dynlib.ext, sep = "")
    dyn.unload(dynlib)
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53054331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档