我正在嘗試通過使用 Rcpp 更快地在 R 中進行一些統計計算。首先,我用 R 撰寫代碼。然后我使用 Qt Creator 用 C 撰寫代碼,這需要我使用 Boost 包。現在,當我嘗試使用sourceCpp()
編譯一個簡單的函式時boost::math::statistics::two_sample_t_test()
,我得到
了兩個錯誤——單擊此處查看它在 RStudio 中的外觀。
/Library/Frameworks/R.framework/Versions/3.6/Resources/library/BH/include/boost/compute/algorithm/random_shuffle.hpp
在命名空間“std”中沒有名為“random_shuffle”的成員;你的意思是簡單的'random_shuffle'嗎?
~/Documents/Research/P-value correction project/Perm FDR with C using Rcpp/PermFDR_R/Rcpp.cpp
no member named 'two_sample_t_test' in namespace 'boost::math::statistics'
這是發生這種情況時彈出的 /Library/Frameworks/R.framework/Versions/3.6/Resources/library/BH/include/boost/compute/algorithm/random_shuffle.hpp 中代碼的螢屏截圖。
這是R代碼。
library(Rcpp)
library(rstudioapi)
library(BH)
Sys.setenv("PKG_CXXFLAGS"="-std=c 17")
sourceCpp("Rcpp.cpp")
這是 C 代碼。
//[[Rcpp::depends(BH)]]
#include <Rcpp.h>
#include <vector>
#include <cmath>
#include <iostream>
#include <random>
#include <boost/math/statistics/t_test.hpp>
#include <boost/math/distributions/students_t.hpp>
#include <boost/math/tools/univariate_statistics.hpp>
#include <boost/compute/algorithm/random_shuffle.hpp>
#include <boost/accumulators/accumulators.hpp>
#include <boost/accumulators/statistics/stats.hpp>
#include <boost/accumulators/statistics/mean.hpp>
#include <iomanip>
#include <numeric>
#include <random>
//[[Rcpp::plugins(cpp17)]]
using namespace std;
#include <Rcpp.h>
using namespace Rcpp;
/*
* Performs a T test on the measurements according to the design (1s and 2s)
* and returns a P value.
*/
double designTTest(vector<double> ints, vector<int> design) {
if (ints.size() != design.size()) {
cout << "ERROR: DESIGN VECTOR AND MEASUREMENT VECTOR NOT EQUAL IN LENGTH!";
throw;
}
vector<double> cIntensities;
vector<double> tIntensities;
for (int i = 0; i < design.size(); i ) {
if (design[i] == 1) {
cIntensities.push_back(ints[i]);
} else if (design[i] == 2) {
tIntensities.push_back(ints[i]);
} else {
cout << "ERROR: DESIGN SYMBOL IS NOT 1 OR 2!";
throw;
}
}
auto [t, p] = boost::math::statistics::two_sample_t_test(cIntensities, tIntensities);
return p;
}
// [[Rcpp::export]]
double ttestC(NumericVector ints, NumericVector design) {
vector<double> intVec = as<std::vector<double>>(ints);
vector<int> designVec = as<std::vector<int>>(design);
return designTTest(intVec, designVec);
}
謝謝!!
uj5u.com熱心網友回復:
您的問題有很多內容,我不確定我是否理解所有內容(“設計排序”非常不清楚)。
但是,我可以幫助您了解via的機制Rcpp
和使用。我可以提出一些改變:Boost
BH
- 您不需要指定 C 11 或 C 17;在最新版本下,R 已經默認為 C 14(如果編譯器支持)(編輯:我們重新添加 C 17 以確保結構化系結有效)
- 你不需要所有這些標題:我們需要一個for
Rcpp
,一個forBoost
- 我反對
using namespace ...
并建議明確命名 - 你不需要 R 向量的包裝器,
std::vector<...>
就像Rcpp
你需要的那樣 - 我通過簡化錯誤報告
Rcpp::stop()
有了這一切,再加上一個運行該函式的迷你演示,您的代碼變得更簡單、更短。
代碼
// [[Rcpp::depends(BH)]]
// [[Rcpp::plugins(cpp17)]]
#include <Rcpp.h>
#include <boost/math/statistics/t_test.hpp>
// Performs a T test on the measurements according to the design (1s and 2s)
// and returns a P value.
// [[Rcpp::export]]
double designTTest(std::vector<double> ints, std::vector<double> design) {
if (ints.size() != design.size()) Rcpp::stop("ERROR: DESIGN VECTOR AND MEASUREMENT VECTOR NOT EQUAL IN LENGTH!");
std::vector<double> cIntensities, tIntensities;
for (size_t i = 0; i < design.size(); i ) {
if (design[i] == 1) {
cIntensities.push_back(ints[i]);
} else if (design[i] == 2) {
tIntensities.push_back(ints[i]);
} else {
Rcpp::stop("ERROR: DESIGN SYMBOL IS NOT 1 OR 2!");
}
}
auto [t, p] = boost::math::statistics::two_sample_t_test(cIntensities, tIntensities);
return p;
}
/*** R
designTTest(c(1,2,1,2,1), c(2,1,2,1,2))
*/
我們可以將其用于編譯和示例(可能包含無意義的資料)。
輸出
> Rcpp::sourceCpp("~/git/stackoverflow/72652032/answer.cpp")
> designTTest(c(1,2,1,2,1), c(2,1,2,1,2))
[1] 0
>
我洗掉了一堆編譯噪音,當您添加-Wno-parentheses
到您的CXXFLAGS
in時,這些噪音就會消失~/.R/Makevars
。CRAN 不允許我(作為BH
維護者)保持上游#pragmas
如此嘈雜,它是......
uj5u.com熱心網友回復:
在完整的編譯器輸出中,boost 告訴您不應該包含<boost/math/tools/univariate_statistics.hpp>
. 你應該包括<boost/math/statistics/univariate_statistics.hpp>
:
/usr/include/boost/math/tools/univariate_statistics.hpp:15:1: note: ‘#pragma message: This header is deprecated. Use <boost/math/statistics/univariate_statistics.hpp> instead.’
遵循該建議,我不再收到std::random_shuffle
錯誤訊息。
關于另一個錯誤訊息two_sample_t_test
可能是因為它是最近才添加到 boost 的,版本為 1.76,請參閱https://github.com/boostorg/math/pull/487。您可能使用的是舊版本。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/496986.html