Windows下Rcpp打包函数在parLapply中调用报错问题求助
问题解决方案
一、无需手动修改NAMESPACE的打包方法
你调用Rcpp.package.skeleton时无需手动关闭attributes参数,使用默认配置即可自动生成正确的导出规则,不会出现Rcpp.fake.fun相关报错,正确打包代码如下:
library(Rcpp) cpp_src_path <- "~/R/rcpp/sample_p.cpp" # C++实现存储路径 dest_path_of_pkg <- "~/R/rpkg/" # 包骨架生成路径 Rcpp.package.skeleton( name = "mypkg", path = dest_path_of_pkg, force = TRUE, cpp_files = cpp_src_path, example_code = FALSE )
运行上述代码后,compileAttributes会自动执行,生成的NAMESPACE会自动带上export(f_sample_p)规则,无需手动修改。你之前出现假导出条目的原因是手动将attributes参数设为了FALSE。
二、parLapply调用Rcpp包函数的正确方法
你报错的核心原因是:clusterExport仅能导出R层函数外壳,无法同步导出函数依赖的包命名空间内的底层C++符号。正确做法是直接在每个集群节点上加载你编译好的mypkg包,不需要导出任何相关函数:
library(parallel) sim_function <- function(n){ z <- f_sample_p(n, 8) return(sum(z)) } x <- runif(100, 1, 10) # 初始化集群 cl <- makeCluster(2) # 核心配置:给每个集群节点加载mypkg包,填入你对应的安装路径 clusterEvalQ(cl, { library("mypkg", lib.loc = "~/R/rlib/") }) # 无需导出f_sample_p等变量,直接调用即可 result <- parLapply(cl, x, sim_function) # 运行结束后关闭集群 stopCluster(cl)
原理是每个集群节点都是独立的R进程,只要进程加载了mypkg包,f_sample_p对应的底层_mypkg_f_sample_p符号就会被正确注册,不会出现找不到对象的报错。如果需要进一步提升稳定性,可以在调用函数时显式指定命名空间:
sim_function <- function(n){ z <- mypkg::f_sample_p(n, 8) return(sum(z)) }
补充说明
_mypkg_f_sample_p是Rcpp自动生成的标准导出命名规则,无需手动修改,强制修改反而会导致编译、调用失败。
内容的提问来源于stack exchange,提问作者Domenico Spidy Tamburro
相关产品推荐
相关产品推荐

