将 R 转换为 C++(最终使用 Rcpp)

机器算法验证 r C++
2022-03-12 12:31:22

我想学习使用Rcpp我浏览了包的 CRAN 网站上的文档,但我觉得做一个实际的例子(第二个实用的,考虑 convolve3)会更有帮助。

我建议使用以下代码,来自robustbase包,因为它既不太长也不太短,使用R 类型和R 函数的组合,并且在R 中具有那些太慢的小算术迭代之一。你如何处理Rcpp -ing 吗?

scaleTau2<-function (x, c1 = 4.5, c2 = 3, consistency = TRUE, mu.too = FALSE){
n <- length(x)
medx <- median(x)
x. <- abs(x - medx)
sigma0 <- median(x.)
mu <- if (c1 > 0) {
    x. <- x./(sigma0 * c1)
    w <- 1 - x. * x.
    w <- ((abs(w) + w)/2)^2
    sum(x * w)/sum(w)
}
else medx
x <- (x - mu)/sigma0
rho <- x^2
rho[rho > c2^2] <- c2^2
if (!identical(consistency, FALSE)) {
    Erho <- function(b) 2*((1-b^2)*pnorm(b)-b*dnorm(b)+b^2)-1
    Es2 <- function(c2) Erho(c2*qnorm(3/4))
    nEs2 <-ifelse(consistency == "finiteSample",n-2,n)*Es2(c2)
}
else nEs2 <- n
c(if (mu.too) mu, sigma0 * sqrt(sum(rho)/nEs2))
}

请尽可能多地解释。

编辑这实际上是逐步解释如何将编写良好(并记录在案)的 R 代码(因此至少基础是好的)转换为有效实现的想法。代码的选择有点随机,但我认为它反映了我们蓝图上的典型脚本(调用不想翻译的 R 函数,使用算术循环......)。

EDIT2从评论中我意识到这实际上可能是在 C++ 中要做的一项大工作(发布代码时我没有意识到)。在这方面,使用单个作品作为教学工具是可以的。我最终将通过编辑问题将这些片段一起解析。

1个回答

有趣的问题,但很可能太具有挑战性,无法简单讨论:

  • 你需要一个 C++ 端的实现median()

  • 来自包robustbase的引用代码是高度“R 优化”的,这可能不是最好的起点。

  • Rcpp不是一个“R 编译器”,您可以将任何此类函数扔给它以“让它更快”。它更多是关于连接现有的 C++ 代码,或编写新的 C++ 代码。

  • 当然,以上内容可以翻译(图灵等效等),但这可能不是学习使用Rcpp的最佳方式。我认为我们在邮件列表中有更简单的示例。

最后,这不是 SO 的编程问题吗?;-)