Это потому, что вы используете a.cpp
; Имена функций C ++ "искажены" компилятором. Вы можете использовать тот же код с именем файла a.c
, скомпилировав его так же, как вы это сделали, и получить от R следующее:
> dinfo <- dyn.load("a.so")
> .C("double_me",x=2)
$x
[1] 2
Или, альтернативно, вы можете добавить эту строку в начало a.cpp
:
extern "C" void double_me(int* x);
и получите от R следующее:
> dinfo <- dyn.load("a.so")
> .C("double_me",x=2)
$x
[1] 2
Обновление: почему результат был выше 2?
Если вы не приведете аргумент к нужному типу, может быть сделана копия, так что ваше исходное значение не будет изменено; если мы приведем значение к целому числу, как и при использовании .C()
, мы получим ожидаемый результат:
> dyn.load("a.so")
> .C("double_me", x = as.integer(2))
$x
[1] 4