R을 C ++로 번역 (결국 Rcpp 사용) [닫기]


10

Rcpp 사용법을 배우고 싶습니다 . 패키지의 CRAN 웹 사이트에서 문서를 살펴 보았지만 실용적인 예제 (convolve3를 고려한 두 번째 실용적인)에 대한 작업이 더 도움이 될 것이라고 생각합니다.

로버 스트베이스 패키지 는 다음과 같은 코드를 제안합니다. 너무 길지도 짧지 않기 때문에 R 유형과 R 함수의 조합을 사용하며 R에서 너무 느린 작은 산술 반복 중 하나가 있습니다. -알아?

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 Eddelbuettel

@ Dirk :> 물론, 제안 된 제목은 무엇입니까 (오래된 제목)? 코드를 더 빨리 실행시키는 방법을 배우는 데 관심이있는이 특정 기능에 대해서는 실제로 신경 쓰지 않습니다. 다른 예가 있으면 게시하십시오. 나는 이것을 즐겁게 닫을 것이다.
user603

답변:


13

흥미로운 질문이지만 간단히 논의하기에는 너무 어려울 수 있습니다.

  • C ++ 측 구현이 필요합니다. median()

  • 튼튼한 패키지 패키지에서 인용 된 코드 는 'R- 최적화'된 것으로 최고의 시작점이 아닐 수 있습니다.

  • Rcpp 는 'R 컴파일러'가 아니기 때문에 '더 빠르게'하기 위해 그러한 기능을 던집니다 . 기존 C ++ 코드를 연결하거나 새 C ++ 코드를 작성하는 것에 대한 자세한 내용입니다.

  • 물론 위의 내용은 번역 할 수 있지만 (Turing-equivalence와 그 모든 것) Rcpp 사용에 대해 배우는 가장 좋은 방법은 아닙니다 . 메일 링리스트에 더 간단한 예가 있다고 생각합니다.

마지막으로, 이것이 SO에 대한 프로그래밍 질문이 아닙니까? ;-)


@ Dirk :> a) median () (PCAPP 패키지의 'pull')의 구현이 많으므로 공정한 게임입니다. b) 당신은 실행 시간이 크게 증가하지 않는 것을 의미합니까? c) 좋아,하지만이 코드의 문제는 실제로 C ++ 로의 번역이 아니라 C ++에서 일부 R 함수 [pnorm, dnorm, ...]를 호출하는 아이디어라고 생각합니다 (물론 실제로 잘못 될 수 있습니다) d) 메일 링리스트에 대한 링크를 제공 할 수 있습니까?
user603

하위 질문을 하나씩 나눌 수 있습니까? A) 편의상 속도는 아니지만 C ++에서 R 함수를 호출 할 수 있습니다. Rcpp의 예제 /를 참조하십시오. B) 나는 그런 말을하지 않았다. C) Rcpp 0.8.7부터는 쉬운 일이다. 'Rcpp 설탕'문서, Rcpp-devel에 대한 게시물 및 최근 프레젠테이션을 참조하십시오. D) R- 포지 페이지가 중단됩니다. 'rcpp-devel'을 Google에 추가하십시오.
Dirk Eddelbuettel

1
1) dirk.eddelbuettel.com/presentations.html 에서 시작하여 진행 하십시오. 2) 예제에는 6 개의 서브 디렉토리가 있으므로 왜 하나에 초점을 두는지 모르겠습니다. 3) 자세히 살펴보면 770+ 단위 테스트가 예제로 두 배가됩니다. 4) Rcpp 패키지에는 8 개의 비 네트가 있습니다. 5) 우리는 Rcpp를 사용하는 몇 가지 다른 패키지를 만들었습니다. 6) 마지막으로 CRAN은 Rcpp에 따라 15 개의 패키지를 나열합니다. 이것도 모두 예입니다.
Dirk Eddelbuettel

1
친구 : 관심있는 프로젝트 에 대한 메일 링리스트가 있습니다 . 모든 문서는 메일 링리스트에 요청하도록 제안합니다. 그래서 왜 오, 왜 여기에 말뚝을 쌓고 있습니까? 우리는 할 수 제발 이제 그만. 마지막으로, '너무 피상적 인'것은 약간의 백업이 필요합니다. 패치를 기꺼이 검토 하겠습니다 . 여기에 게시하지 마십시오 . 확인?
Dirk Eddelbuettel

2
@kwak : "커뮤니티에 아웃소싱해야하는 것"에 응답 :이 예제를 직접 진행하면서 여러분의 기여를 기대합니다.
Joshua Ulrich
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.