3

unlistまたはを呼び出すcと、型はすべてを表すことができる最小の型に昇格されます。

> c(as.integer(1), 2.3, '3')
[1] "1"   "2.3" "3"  
> c(TRUE, 5)
[1] 1 5
> unlist(list(as.integer(1:5), as.complex(2:4)))
[1] 1+0i 2+0i 3+0i 4+0i 5+0i 2+0i 3+0i 4+0i

C/C++ コードからこのロジックにアクセスするにはどうすればよいですか?

cとの C ソースを探したところ、と( )unlistの両方に次のコードが見つかりました。do_c_dfltdo_unlistmain/bind.c

if (data.ans_flags & 512)      mode = EXPRSXP;
else if (data.ans_flags & 256) mode = VECSXP;
else if (data.ans_flags & 128) mode = STRSXP;
else if (data.ans_flags &  64) mode = CPLXSXP;
else if (data.ans_flags &  32) mode = REALSXP;
else if (data.ans_flags &  16) mode = INTSXP;
else if (data.ans_flags &   2) mode = LGLSXP;
else if (data.ans_flags &   1) mode = RAWSXP;

dataタイプの変数は、強制ロジックを定義しているように見えるBindDataルーチンによって計算されます。AnswerTypeただし、型のBindData宣言は inbind.cのみです。

だから:Rの一般的な強制ロジックはどこかにエクスポートされていますか、それともコードをコピーして貼り付けなければなりbind.cませんか?(ネタバレすみません…)

4

1 に答える 1

1

Kevinが Rcpp ギャラリーに記事を投稿しました。これは精神的にかなり近いもので、R の API のマクロを使用して明示的にテストしています。

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
List do_stuff( List x_ ) {
    List x = clone(x_);
    for( List::iterator it = x.begin(); it != x.end(); ++it ) {
        switch( TYPEOF(*it) ) {
            case REALSXP: {
                NumericVector tmp = as<NumericVector>(*it);
                tmp = tmp * 2;
                break;    
            }
            case INTSXP: {
                if( Rf_isFactor(*it) ) break; // factors have type INTSXP too
                IntegerVector tmp = as<IntegerVector>(*it);
                tmp = tmp + 1;
                break;
            }
            default: {
                stop("incompatible SEXP encountered;");
            }
       }
  }  
  return x;
}
于 2013-04-09T18:50:43.580 に答える