gpt4 book ai didi

r - 从 C 包装器调用 R 函数

转载 作者:行者123 更新时间:2023-12-04 11:13:45 25 4
gpt4 key购买 nike

我有一个这样的功能:

callFunc <- function (f) {
f(1)
}
f可以是(例如) f <- function (x) x .为了简化事情,假设我知道 f 应该返回一个数字并接受一个数字。

我想搬家 callFunc到C,但仍有功能 f在 R 中定义,即
.Call('callFunc', function (x) x)

我正在苦苦思索如何在 C 端评估我的回调。
我现在是这样的:
#include <R.h>
#include <Rdefines.h>

SEXP callFunc (SEXP i_func) {
return i_func(1);
}

(然后测试它:
R CMD SHLIB test.c
# then in R
dyn.load('test.so'); .Call('callFunc', function (x) x)

)

当然,以上不起作用,因为
  • 我没有强制i_func进入适当的关闭形式;我不知道该怎么做( AS_foo 中有 Rdefines.h 宏,但没有 AS_CLOSURE )。
  • 我什至没有告诉 C 代码 i_func应该接受一个数字并返回一个数字,那么它如何评估?

  • 谁能告诉我如何去做这件事?
    我正在努力解决 writing R extensions但这很长,我还没有找到我想要的东西。还有 this question on R-help但答案似乎是他们实现了回调 f在 C 中也是如此,而不是将其保留为 R 对象。

    最佳答案

    使用 Rcpp 这很容易:

    Rcpp::cppFunction("SEXP callFun(Function f) {
    return f(1);
    }")

    callFun(function(x) x + 10)
    # [1] 11

    关于r - 从 C 包装器调用 R 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23488203/

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