Я собрал свой собственный пакет R, содержащий функцию c, созданную с помощью inline::cfunction()
. В рамках моих проектов R я устанавливаю пакет через install.packages()
и require()
it. Когда я в конце концов вызываю свою функцию C, скомпилированный код не найден.
Когда я непосредственно запускаю определение функции в своих проектах, функция является исполняемой.
В моем пакете "myPkg":
Определение моей функции:
test = inline::cfunction(sig = c(x="integer"),
body = 'return(x);')
Сборка пакета через:
R CMD INSTALL --no-multiarch --with-keep.source myBayes
В рамках моего проекта:
установка с локального компьютера:
install.packages(pkgs = "/path/to/myPkg",
type = "source",
repos = NULL)
вызов функции
test(2)
Проблемы
Вызов test(2)
Результат:
Error in .Primitive(".Call")(<pointer: 0x0>, x) :
NULL value passed as symbol address
вызов test
результат:
An object of class "CFunc"
function (x)
.Primitive(".Call")(<pointer: 0x0>, x)
<bytecode: 0x107c0bd18>
<environment: 0x107c0fb20>
Slot "code":
[1] "#include <R.h>\n#include <Rdefines.h>\n#include <R_ext/Error.h>\n\n\nextern \"C\" {\n SEXP filee3e4c1e3f3 ( SEXP x );\n}\n\nSEXP filee3e4c1e3f3 ( SEXP x ) {\nreturn(x);\n warning(\"your C program does not return anything!\");\n return R_NilValue;\n}\n"
вызов test
после запуска определения функции непосредственно в моем сеансе R приводит к:
An object of class "CFunc"
function (x)
.Primitive(".Call")(<pointer: 0x101c03fa0>, x)
<environment: 0x109070418>
Slot "code":
[1] "#include <R.h>\n#include <Rdefines.h>\n#include <R_ext/Error.h>\n\n\nextern \"C\" {\n SEXP filee7277d5c2fa6 ( SEXP x );\n}\n\nSEXP filee7277d5c2fa6 ( SEXP x ) {\nreturn(x);\n warning(\"your C program does not return anything!\");\n return R_NilValue;\n}\n"
тогда test(2)
работает, потому что он становится частью .GlobalEnv