【问题标题】:Is it possible to pass Rcpp functions to a child process?是否可以将 Rcpp 函数传递给子进程?
【发布时间】:2017-11-29 03:38:13
【问题描述】:

我已经使用 Rcpp 定义了一个函数,它在当前会话中运行。所以我尝试使用future包在每个worker进程中编译相同的函数,但是我遇到了错误

错误:构建共享库时发生错误 1。

是否有一种无需构建包即可轻松共享 Rcpp 功能的方法?

见下面的 MWE

library(Rcpp)
cppFunction('
            NumericVector test(Rcpp::NumericVector x) {
            return x;
            }')

# test if compiled successful
test(1:2)

lapply(list(1:2), test) # works

future_lapply(list(1:2), function(a) {
  library(Rcpp)
  cppFunction('
     NumericVector test(Rcpp::NumericVector x) {
     return x;
  }')
  test(a)
 })

【问题讨论】:

  • 你想要做的基本上等同于通过foreach 传播基于 Rcpp 的函数。简而言之,你不能。他们坐在一个“随机”的本地记忆点。唯一可靠的方法是把它们放在一个包裹里,让每个工人装载包裹。那会奏效的。
  • 有没有办法通过指针共享位置并将指针传递给工作人员?
  • 问题是需要传输的内存内容。你不能。因此是一个包。
  • 那么我会接受“否”的答案。
  • 我认为答案不是“否”,而是“制作一个包裹”。

标签: r rcpp


【解决方案1】:

这个问题实际上等同于通过foreach 传播基于 Rcpp 的函数。简而言之,您不能序列化基于 Rcpp 的函数并传递它。

它们位于“随机”的本地内存点。唯一可靠的方法是将它们粘在一个包裹里,让每个工人装载包裹。这会起作用的。

【讨论】:

  • 谢谢,是否可以在 R 包中构建包(例如,utils)?还是应该为基于 Rcpp 的功能创建另一个包?
  • 包装没有实际成本或开销。确实存在单功能包。从Rcpp.package.skeleton("mypackagenamehere") 开始,添加你的函数,你基本上就完成了。
  • 感谢您的回复。我计划将主包提交给 CRAN。根据您的建议,我也需要将子包提交给 CRAN。对吗?
  • 你正在写一个包。将您关心的 C++ 函数粘贴到该包中。为什么你需要另一个?此外,我们还有一个 Rcpp 邮件列表——可能是一个更好的地方,可以解决一个不相关的 3 1/2 年前的问题。
  • 谢谢。我加入了邮件列表。但我的问题就是这个话题。我不认为这无关。我添加到我的 R 包并使用 Rcpp 编译的 C++ 函数在整个包中都可用。但是,它不适用于 parLapply 工作人员。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-08
  • 1970-01-01
  • 2021-07-29
  • 2015-05-11
  • 2021-11-11
  • 1970-01-01
相关资源
最近更新 更多