13

で次の R 関数をレプリケートしたいRcpp:

fR = function(x) x[1:2]

fR(c(1,2,3))
#[1] 1 2
fR(c('a','b','c'))
#[1] "a" "b"

私は次のように固定出力タイプに対してそれを行うことができます:

library(inline)
library(Rcpp)

fint = cxxfunction(signature(x = "SEXP"), '
          List xin(x);
          IntegerVector xout;

          for (int i = 0; i < 2; ++i) xout.push_back(xin[i]);

          return xout;', plugin = "Rcpp")

しかし、これは整数に対してのみ機能し、xoutタイプをList(またはGenericVector、同じである)に置き換えようとすると、どの入力タイプでも機能しますlistが、ベクトルではなく a が返されます。

これを行う正しいRcpp方法は何ですか?

4

2 に答える 2

0

タイプを選択する必要があります (つまり、signature="SEXP"[ああ、とにかく属性を調べる必要があります] を使用しないでください)。

または、SEXP型を保持し、内部でディスパッチします。たとえば、Rcpp Gallery のこの投稿を参照してください。

編集:もちろん、Cは静的に型付けされています。タイプに応じたこれらの非常にスイッチは、Rソースにもあります。ここには無料の昼食はありません。

于 2013-11-06T22:23:34.033 に答える