如何从R包中的动态库计算C函数?

如何从R包中的动态库计算C函数?,r,parallel-processing,rparallel,R,Parallel Processing,Rparallel,我试图在一个R包中实现并行计算,该包使用.C函数从R调用C。集群的节点似乎无法访问动态库。我制作了一个并行套接字集群,如下所示: cl <- makeCluster(2) out <- foreach(1:no_cores) %dopar% {.C(C_valgrad, …)} 其中,…表示C函数valgrad中的参数。我得到这个错误: Error in checkForRemoteErrors(lapply(cl, recvResult)) : 2 nodes produ

我试图在一个R包中实现并行计算,该包使用
.C
函数从R调用C。集群的节点似乎无法访问动态库。我制作了一个并行套接字集群,如下所示:

cl <- makeCluster(2)
out <- foreach(1:no_cores) %dopar% {.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
评估,如下所示:

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

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

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

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

请参见文档文件夹第5节或相关章节中的R-exts.pdf文件,编写R扩展名


dynLoad“我可以使用foreach函数对每个集群上的valgrad进行评估…”-这可能是因为您在Unix/macOS上,使用的是创建分叉进程的
registerDoParallel(ncore)
。使用
cl,如果我构建包,这对我仍然有帮助吗?编写R扩展说明
.C
提供了“编译代码的接口,该接口在构建时或通过
dyn.load
链接到R中。”