함수의 반환 형식이 NumericVector
이지만, double
로 변환 스칼라 값은 Rcpp::mean
반환 : 다음 코드는하지만 여전히 작동하지 않습니다.
library(Rcpp)
cppFunction(
"double fun(int n, double lambda) {
NumericVector y = rpois(n, lambda);
NumericVector w = dpois(y, lambda);
NumericVector x = w*y;
double z = mean(x);
return z;
}")
set.seed(123)
fun(50, 1.5)
# [1] 0.2992908
NumericVector
이후 반환 형식,
this constructor is called로 지정되는 코드에서 어떤 일이 일어나고 무엇
,
template <typename T>
Vector(T size,
typename Rcpp::traits::enable_if<traits::is_arithmetic<T>::value, void>::type* = 0) {
Storage::set__(Rf_allocVector(RTYPE, size)) ;
init() ;
}
필수 유형으로 double
캐스트 :이 문제를 해결하면 문제가 해결됩니다 double
의 잘린 값과 동일한 길이의 NumericVector
을 작성합니다. ,
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector from_double(double x) {
return x;
}
/*** R
sapply(0.5:4.5, from_double)
# [[1]]
# numeric(0)
#
# [[2]]
# [1] 0
#
# [[3]]
# [1] 0 0
#
# [[4]]
# [1] 0 0 0
#
# [[5]]
# [1] 0 0 0 0
*/
편집을 보여주기 위해 : 당신의 초 질문에 대해서는, 당신은 sqrt(2/n)
에 의해 분할되어 2
및 n
대부분의 경우 0으로 분열을 일으키는 원인이 끝나는 모두 정수, 어디에 - 따라서 결과 벡터의 모든 Inf
값 당신은 2.0
대신 2
를 사용하여이 문제를 해결할 수 있습니다
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector zstat(int n, double lambda, double lambda0, int m) {
NumericVector z(m);
for (int i=1; i<m; ++i){
NumericVector y = rpois(n, lambda0);
NumericVector w = dpois(y, lambda)/dpois(y,lambda0);
double x = mean(w * y);
// z[i] = (x - 2)/sqrt(2/n);
// ^^^^^
z[i] = (x - 2)/sqrt(2.0/n);
// ^^^^^^^
}
return z;
}
/*** R
set.seed(123)
zstat(25, 2, 3, 10)
# [1] 0.0000000 -0.4427721 0.3199805 0.1016661 0.4078687 0.4054078
# [7] -0.1591861 0.9717596 0.6325110 0.1269779
*/
C++은 R 아니다 - 당신은 당신의 변수의 유형에 대한 더 조심해야합니다.
감사합니다. 그러나 내 코드로 잘못된 문제를 확인했습니다. 전체 코드를 살펴볼 수 있습니까? –
* "작동하지 않음"* 무엇을 의미합니까? 이 함수를 호출하는 방법을 보여주고 원하는 결과가 무엇인지 설명해야합니다. – nrussell
내가 zstat (25,2,3,100)을 사용하여 호출하면 0 Inf -Inf -Inf -Inf Inf Inf -Inf ...를 사용합니다. 의도하지 않은 결과입니다. 원하는 결과는 첫 번째 코드 (고정 된 후)가 벡터 z에 저장되지만 m 번 반복되는 코드 여야합니다. –