Пакет R с кодом C, `` нет такого символа '' в пакете dll
Я пишу пакет R и начал включать в него код C. Следуя инструкциям отсюда , в разделе «Начало работы с .C ()», я создал функцию ac в src / и оболочку r для нее, связав ее через тег roxygen @useDynLib(<package-name>, <name_of_c_function>)
.
Однако после запуска devtools::document()
я получаю следующую ошибку:
Error in FUN(X[[i]], ...) :
no such symbol <name_of_c_function> in package C:/path/to/package/src/<package-name>.dll
Я читал, что обновление R и Rtools устранило проблему для некоторых. Я вчера обновил их оба, но безрезультатно.
Любая помощь будет высоко ценится.
(Это похоже на проблему в этом вопросе , на который в настоящее время нет ответа.)
(Это также может быть связано с этим вопросом , за исключением того, что я использую devtools :: document () вместо R CMD в этом вопросе.)
Соответствующий код:
# R file
#' @useDynLib <package-name> <name_of_c_function>
#' @export
name_of_func <- function(y) {
stopifnot(is.numeric(y))
.C(name_of_c_function, y,y,length(y),1) [[2]]
}
// C file
<#include stdlib.h>
static void name_of_c_function(double* y, double* x,
const unsigned int length, const double a) {...}
Ответы
Оказывается проблема в этой строчке
static void name_of_c_function(...){...}
Как упоминалось в этом посте ,
Ключевое слово static несколько чрезмерно используется. Когда это применяется к функции, это означает, что функция имеет внутреннюю связь, то есть ее область действия ограничена единицей перевода (просто как исходный файл).
Другими словами, ключевое слово static запрещает вызов функции извне ее собственного модуля, что приводит к ошибке «нет такого символа».
Удаление ключевого слова static решает проблему.