私のRcpp機能に問題があります。私は基本的にデータフレーム(次元N*K
)と数値ベクトル(次元H < N
)を入力として持ち、出力として整数ベクトルの同じ行インデックスを持つデータフレーム(寸法H * M
)を返したいと思います。IDでRcppのdata.frameをサブセット化すると '要求の種類と互換性がありません'
データフレーム:
val1 val2 val3 val4
1 0.2059 A 14
2 0.5700 B 61
3 0.5354 C 24
4 0.8123 D 78
5 0.7542 E 39
6 0.6433 F 17
7 0.2452 G 96
8 0.2557 H 93
9 0.7208 I 36
10 0.2565 L 12
整数ベクトル:
2
4
7
10
OUTPUT:
2 0.5700 B 61
4 0.8123 D 78
7 0.2452 G 96
10 0.2565 L 12
ここに私のコードです。あなたの助けを前もってありがとう:
#include <RcppArmadillo.h>
using namespace Rcpp;
// [[Rcpp::export]]
DataFrame matchRows(DataFrame &OriginalDF, NumericVector &ReducedVector)
{
int nr1 = OriginalDF.nrows(), nc1= OriginalDF.size();
int nr2 = ReducedVector.size();
if (nr1 < nr2) throw std::range_error("Size of data frame has to be higher than the target random subset!");
std::map<double, DataFrame> X;
for (int j = 0; j < nr2; j++)
{
NumericVector tmp1=wrap(OriginalDF[ReducedVector[j]]);
tmp1.attr("dim")=Dimension(int(tmp1.size())/nc1,nc1);
DataFrame NewDF(wrap(tmp1));
NewDF.push_back(OriginalDF[ReducedVector[j]]);
NewDF.attr("names")=OriginalDF.attr("names");
X[ReducedVector[j]] = NewDF;
}
return wrap(X);
}
私の以前のバージョンのコードでは、残念ながらRStudioがクラッシュしました。理想的にはゼロにデータフレームを初期化してpush_back()
を使用して値を追加するためのいくつかの方法があります:
// [[Rcpp::export]]
DataFrame matchRows(DataFrame &OriginalDF, NumericVector &ReducedVector)
{
int nr1 = OriginalDF.nrows(), nc1 = OriginalDF.size();
int nr2 = ReducedVector.size();
if (nr1 < nr2) throw std::range_error("Size of data frame has to be higher than the target random subset!");
DataFrame NewDF;
for (int j = 0; j < nr2; j++)
{
NewDF.push_back(OriginalDF[ReducedVector[j]]);
}
return NewDF;
}
完全なエラーメッセージを入力して、コードのどの行でエラーが発生したかを示します。次に、デバッグを行います。つまり、すべての変数(特に代入または変換する変数)に期待する型があるかどうかを確認します。 – Roland
Rcppスクリプトはエラーなしで実行されます。しかし、rで関数を呼び出すと、「要求タイプと互換性がありません」というエラーメッセージが表示されます。 –
私はそれをexemple [here](http://stackoverflow.com/questions/24353078/rstudio-crashes-with-rcpp-with-reproducible-codes)にしたがってデバッグしようとしましたが、RStudioでも同じ問題が発生します。 –