将R转换为C ++(最终使用Rcpp)[关闭]


10

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

我从robustbase软件包中提出了以下代码,因为它既不会太长也不会太短,它使用R类型和R函数的组合,并且具有那些在R中速度太慢的小型算术迭代之一。 -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 ++中要做的一项大工作(发布代码时我没有意识到)。鉴于此,可以使用单个零件作为教学设备。我最终将通过编辑问题来将各个部分解析在一起。


3
强烈不同意您编辑的标题和添加/编辑的问题。如果您认为Rcpp是代码编译器,或者在要求我们为您重写代码时,您会误会。
德克·埃德比布特

@Dirk:>当然,建议的标题是什么(较旧的标题?)。我不太在乎这个特定的功能,我有兴趣学习使我的代码运行更快的方法。如果您还有其他示例,请发布。我会很高兴地关闭这个。
user603 2010年

Answers:


13

有趣的问题,但很有可能太过挑战而无法简要讨论:

  • 您将需要C ++端的实现 median()

  • 软件包robustbase中引用的代码是高度“ R优化”的,这可能不是最佳起点。

  • Rcpp不是一个“ R编译器”,您可以将其抛弃以使其“更快”。它更多地是关于连接现有的C ++代码或编写新的C ++代码。

  • 当然以上可以翻译(图灵等价和所有),但未必是了解如何使用的最佳方式RCPP。我认为我们在邮件列表中有更简单的示例。

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


@Dirk:> a)平均数()有很多实现(例如pcaPP包中的“ pull”),所以这是公平的游戏。b)您的意思是不会注意到运行时间显着增加?c)好的,但是我认为这段代码的问题实际上并不是C ++的翻译,而是在C ++中调用某些R函数[pnorm,dnorm,...]的想法(当然,我可能真的错了)d)您可以提供邮件列表的链接吗?
user603 2010年

我们可以将子问题一一分开吗?A)您可以从C ++调用R函数-为了方便起见,但不一定是速度。请参阅Rcpp中的示例/。B)我没有说过这样的话。C)从Rcpp 0.8.7开始,这很容易,请参阅“ Rcpp sugar”文档,Rcpp-devel上的帖子以及我们最近的演示。D)挂在R-forge页面上;只是用谷歌搜索“ rcpp-devel”。
德克·埃德比布特

1
1)从dirk.eddelbuettel.com/presentations.html开始,然后逐步进行。2)示例有六个子目录,所以我不确定为什么您只关注其中一个。3)如果您希望仔细观察的话,有770多个单元测试可以作为示例。4)Rcpp软件包中有八(8)个小插曲。5)我们还编写了一些其他使用Rcpp的软件包,您也可以查看它们。6)最后,CRAN根据Rcpp列出了十五个软件包-这些都是示例。
Dirk Eddelbuettel 2010年

1
杜德:有您感兴趣的项目的邮件列表。我们所有的文档建议在邮件列表中询问。那为什么-为什么-为什么要一直堆放在这里?我们可以停止,现在。最后,您的“过于肤浅”将需要一些备份。我会很乐意查看补丁,只是不要在此处发布它们。好?
德克·埃德比布特

2
@kwak:回应“应该将其外包给社区”:我希望您亲自研究这些示例时能看到您的贡献。
约书亚·乌尔里希
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.