RcppArmadillo通过用户定义的函数

编程入门 行业动态 更新时间:2024-10-26 20:28:08
本文介绍了RcppArmadillo通过用户定义的函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

考虑以下R代码,

## ----------- R version ----------- caller <- function(x=1:3, fun = "identity", ...){ ## do some other stuff ## ... ## then call the function eval(call(fun, x)) } fun1 <- function(x, ...){ x + x } fun2 <- function(x, a = 10) a * x caller(fun = "fun1") caller(fun = "fun2")

用户可以传递由caller使用的函数名称"fun".我希望对RcppArmadillo对象执行相同的任务(显然,这是更复杂的任务的一部分).该函数将在C++中定义,并且用户可以通过参考其名称在R级别上对其进行选择:

The user can pass a function name "fun", that is used by caller. I wish to perform the same task with RcppArmadillo objects (as part of a more complex task, obviously). The function would be defined in C++, and the user selects it at the R level by referring to its name:

caller_cpp(1:3, "fun1_cpp")

caller_cpp(1:3, "fun2_cpp")

这是我对调用方函数的幼稚尝试,甚至无法编译:

Here's my naive attempt for the caller function, that even fails to compile:

## ----------- C++ version ----------- library(Rcpp) require( RcppArmadillo ) sourceCpp( code = ' // [[Rcpp::depends("RcppArmadillo")]] #include <RcppArmadillo.h> using namespace arma ; using namespace Rcpp ; colvec fun1_cpp(const colvec x) { colvec y ; y = x + x; return (y); } colvec fun2_cpp(const colvec x) { colvec y ; y = 10*x; return (y); } // mysterious pointer business in an attempt // to select a compiled function by its name typedef double (*funcPtr)(SEXP); SEXP putFunPtrInXPtr(SEXP funname) { std::string fstr = Rcpp::as<std::string>(funname); if (fstr == "fun1") return(Rcpp::XPtr<funcPtr>(new funcPtr(&fun1_cpp))); else if (fstr == "fun2") return(Rcpp::XPtr<funcPtr>(new funcPtr(&fun2_cpp))); } // [[Rcpp::export]] colvec caller_cpp(const colvec x, character funname) { Rcpp::XPtr fun = putFunPtrInXPtr(funname); colvec y ; y = fun(x); return (y); } ')

编辑:在遵循Dirk的建议看RcppDE之后改编了示例.

Edit: adapted the example after following Dirk's suggestion to look at RcppDE.

推荐答案

(有时您需要在文件上使用svn log ...来查看它们的日期...)

(Sometime you need to use svn log ... on files to see how dated they are...)

我认为一个更好的用例是在我的基于C的DEoptim的端口"中到Rcpp/RcppArmadillo:RcppDE.在其中,我允许优化例程使用R函数(如DEoptim所做的那样)或用户提供的编译函数-据我所知,这就是您想要的.

I think a better use case is in my "port" of the C-based DEoptim to Rcpp / RcppArmadillo: RcppDE. In it, I allow the optimization routine to use either an R function (as DEoptim does) or a user-supplied compiled function -- which is what you want here as I understand it.

有一点点C ++脚手架,但是在那之后应该没有问题.

There is a tiny bit of C++ scaffolding, but you should have no problem following that.

2013年1月21日编辑以下是我刚刚发布为此Rcpp Gallery上的新帖子-包括一些评论和示例用法.

Edit on 2013-01-21 Below is a complete solution which I have also justed posted as this new post at the Rcpp Gallery -- including some comments and sample usage.

// [[Rcpp::depends(RcppArmadillo)]] #include <RcppArmadillo.h> using namespace arma; using namespace Rcpp; vec fun1_cpp(const vec& x) { // a first function vec y = x + x; return (y); } vec fun2_cpp(const vec& x) { // and a second function vec y = 10*x; return (y); } typedef vec (*funcPtr)(const vec& x); // [[Rcpp::export]] XPtr<funcPtr> putFunPtrInXPtr(std::string fstr) { if (fstr == "fun1") return(XPtr<funcPtr>(new funcPtr(&fun1_cpp))); else if (fstr == "fun2") return(XPtr<funcPtr>(new funcPtr(&fun2_cpp))); else return XPtr<funcPtr>(R_NilValue); // runtime error as NULL no XPtr } // [[Rcpp::export]] vec callViaString(const vec x, std::string funname) { XPtr<funcPtr> xpfun = putFunPtrInXPtr(funname); funcPtr fun = *xpfun; vec y = fun(x); return (y); } // [[Rcpp::export]] vec callViaXPtr(const vec x, SEXP xpsexp) { XPtr<funcPtr> xpfun(xpsexp); funcPtr fun = *xpfun; vec y = fun(x); return (y); }

更多推荐

RcppArmadillo通过用户定义的函数

本文发布于:2023-10-28 05:14:22,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1535628.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:函数   定义   用户   RcppArmadillo

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!