5

R からマップ/辞書/リストをパラメーターとして c++ 関数に渡すにはどうすればよいですか?

たとえば、次のようなことをしたいです。

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
int test(List map) {
    int val = map["test"];
    return(val);
}

/*** R
map <- list(test = 200, hello = "a")
test(map)
*/

出力は200になるはずです。

4

2 に答える 2

1

Mac OS X でも同様の問題があります。スニペットを実行すると、常に返されるよう1です。ただし、次の方法でコードを変更すると、機能します。

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
int test(List map) {
    int val = as<int>( map["test"] );
    return(val);
}

/*** R
map <- list(test = 200, hello = "a")
test(map)
*/

型推論で何か問題が発生しているようです -として変換する必要がある宣言された変数に割り当てmap["test"]ているため、コンパイラはそれを「認識」する必要がありますが、そうではないようです。したがって、安全のために、R リストから出てくるものには必ず注意してください。intintas

また、次のことも述べておく価値があります。R200double; です。を明示的に渡したい場合は、intと書く必要があります200L

FWIW、私はコンパイルしていclang++ます:

> clang++ -v
Apple LLVM version 4.2 (clang-425.0.28) (based on LLVM 3.2svn)
Target: x86_64-apple-darwin12.4.0
Thread model: posix

> sessionInfo()
R version 3.0.0 (2013-04-03)
Platform: x86_64-apple-darwin10.8.0 (64-bit)

locale:
[1] en_CA.UTF-8/en_CA.UTF-8/en_CA.UTF-8/C/en_CA.UTF-8/en_CA.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] Rcpp_0.10.4
于 2013-07-02T21:42:57.110 に答える
1

あなたが本当に欲しいものを完全には理解していないかもしれませんが、RリストをパラメーターとしてCpp関数に渡したい場合は可能です

Cpp コード

#include <Rcpp.h>

using namespace Rcpp;

// [[Rcpp::export]]
int test(List map) {
    int number = 10;    
    int val = map["test"] + number;
    return(val);
}

/*** R
map <- list(test = 2, hello = "a")
test(map)
*/

この Cpp コードを「/tmp/test.cpp」に保存したとします。

Rコード

require(Rcpp)
sourceCpp("/tmp/test.cpp")
test(map)
## [1] 12
于 2013-07-01T21:02:33.093 に答える