gpt4 book ai didi

c++ - R:指向c函数的指针

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:15:06 26 4
gpt4 key购买 nike

如何将指向函数的指针从 C 代码传递到 R(使用外部 R)并在从 R 调用该函数之后?

类似于:

C:

typedef void (* FunctionPtr)();
SEXP ans;
PROTECT(ans = /* ?some code? */);
R_tryEval(ans, R_GlobalEnv, NULL);
UNPROTECT(1);

回复:

callback_function()

编辑:@Romain Francois 的帖子很有帮助。
我的应用代码:

namespace
{
void callback()
{
std::cout << "callback\n" << std::flush;
}
}
class Worker
{
public:
/*...*/
void initialize(argc, argv)
{
Rf_initEmbeddedR(argc, argv);

SEXP ans, val;
typedef void (* FunctionPtr)();

PROTECT(ans = Rf_lang2(Rf_install("source"), Rf_mkString("script.R")));
R_tryEval(ans, R_GlobalEnv, NULL);
UNPROTECT(1);

PROTECT(val = Rf_ScalarInteger((int)(&callback)));
/* pass the address of the pointer to a function */
PROTECT(ans = Rf_lang2(Rf_install("setCallback"), val));
R_tryEval(ans, R_GlobalEnv, NULL);
UNPROTECT(2);
}
void uninitialize()
{
Rf_endEmbeddedR(0);
}
};

R 和 Rcpp
script.R

###################
sourceCpp("utils.cpp")
###################
callback <- function()
{
callCallback()
}

utils.cpp

#include <Rcpp.h>

using namespace Rcpp;

typedef void (* Callback)();
static Callback spCallback = 0;

// [[Rcpp::export]]
void callCallback()
{
if (spCallback) {
spCallback();
} else {
Rprintf("ERROR: callback is not set");
}
}
// [[Rcpp::export]]
void setCallback(const int address)
{
spPlaceOrder = (Callback)address;
}

最佳答案

外部指针就是您要查找的内容。它们让您封装指向任意数据结构的指针。 data 一词在这里很重要,而函数指针则是另一回事。如果你想使用 C++Rcpp ,我的建议是创建一个封装函数指针的小类:

typedef void (* FunctionPtr)();
class FunctionPointer {
FunctionPtr ptr;
public:
FunctionPointer( FunctionPtr ptr_) : ptr(ptr_){}
} ;

然后创建一个 XPtr<FunctionPointer> :

#include <Rcpp.h>
using namespace Rcpp ;

// your callback function
void callback(){
Rprintf( "hello from callback\n" ) ;
}

// The function that creates an external pointer to your
// callback
// [[Rcpp::export]]
XPtr<FunctionPointer> create_ptr(){
return XPtr<FunctionPointer>( new FunctionPointer(callback) );
}

// The function that invokes the callback
// [[Rcpp::export]]
void invokeCallback( XPtr<FunctionPointer> callback){
callback->ptr() ;
}

在 R 端,您可以使用词法作用域,例如将外部指针包装到 R 函数中:

callback <- local( {
ptr <- create_ptr()
function(){
invokeCallback( ptr )
invisible(NULL)
}
} )
callback()

关于c++ - R:指向c函数的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13904786/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com