2013-07-01 87 views
5

如何將R中的地圖/字典/列表作爲參數傳遞給C++函數?Rcpp map/dictionary/list

例如,我想要做的東西像下面這樣:

#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

+0

我只是想你的代碼是,使用'sourceCpp',我得到了200什麼是你的'sessionInfo' ? – dickoa

+0

R版本3.0.1(2013-05-16) 平臺:x86_64-apple-darwin10.8.0(64位) 區域設置: [1] zh_CN.UTF-8/zh_CN.UTF-8/zh_CN。 UTF-8/C /的en_US.UTF-8 /的en_US.UTF-8 附基礎包: [1]統計圖形grDevices utils的數據集的方法基礎 其他附軟件包: [1] foreach_1.4.1 fpc_2.1 -5 flexmix_2.3-10 lattice_0.20-15 mclust_4.1 cluster_1.14.4 [7] MASS_7.3-26 Rcpp_0.10.3 通過命名空間(並未附加)加載: [1] codetools_0.2- 8 grid_3.0.1 iterators_1.0.6 modeltools_0.2-19 stats4_3.0.1 [6] tools_3.0.1 –

+0

我使用linux不是mac,不知道它是否相關。但在我的設置中,我有'packageVersion(「Rcpp」)=='0.10.4''。嘗試從r-forge上傳Rcpp並再次運行代碼。 – dickoa

回答

1

保存這個.cpp的代碼,我在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"]int-聲明的變量,它應該被轉換爲int,但似乎並非如此。所以,爲了安全起見 - 請確保as列出R列表中的任何內容。

此外,值得一提的是:在R 200double;如果你想明確地通過一個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 
+0

看起來像一個錯誤。我會看看。 –

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) 
*/ 

假設你在「/tmp/test.cpp」

R代碼裏面

require(Rcpp) 
sourceCpp("/tmp/test.cpp") 
test(map) 
## [1] 12 
+0

這是我想要的,但它不起作用(無論我輸入數字,我的輸出結果都是11) –

+0

@tsuyoihikari沒有你的代碼很難分辨。例如完全像寫的那樣? – dickoa

+0

是的,我做過了,(除了我添加了包含rcpp.h) –