如何将 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。
如何将 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。
可能是我不完全理解你真正想要什么,但如果你想将 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
我在 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
-declared 变量,它应该被转换为int
,但情况似乎并非如此。所以,为了安全起见——一定要as
注意 R 列表中的任何内容。
此外,值得一提的是:在 R200
中是 a double
; 如果你想显式传递一个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