У меня есть функция, например, так:Вызов функции Р из С оберткой
callFunc <- function (f) {
f(1)
}
f
может быть (например) f <- function (x) x
. Чтобы упростить ситуацию, скажем, что я знаю, что f должен возвращать числовое число и принимать один числовой.
Я хотел бы перейти callFunc
С, но по-прежнему имеют функцию 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, для полноты? (исключая, например, добавление дополнительных зависимостей) –
Нет, и я потратил достаточно много времени на чтение документации по внутренним документам, которую я не собираюсь выяснять;) – hadley