Paquete R con código C, 'no existe tal símbolo' en el paquete dll

Aug 20 2020

Estoy escribiendo un paquete R y comencé a incluir código C en él. Siguiendo las instrucciones de aquí , en "Introducción a .C()", creé la función ac en src/ y un envoltorio r, enlazando a través de la etiqueta roxygen @useDynLib(<package-name>, <name_of_c_function>).

Sin embargo, después de ejecutar devtools::document(), aparece el siguiente error:

Error in FUN(X[[i]], ...) :
  no such symbol <name_of_c_function> in package C:/path/to/package/src/<package-name>.dll

Leí que la actualización de R y Rtools solucionó el problema para algunos. He actualizado ambos ayer, pero fue en vano.

Cualquier ayuda será muy apreciada.

(Esto es similar al problema en esta pregunta , que actualmente no tiene respuesta).

(También puede estar relacionado con esta pregunta , excepto que uso devtools::document() en lugar de R CMD en esa pregunta).


Código relevante:

# 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) {...}

Respuestas

bert Aug 20 2020 at 16:41

Resulta que el problema está en esta línea.

static void name_of_c_function(...){...}

Como se menciona en esta publicación ,

La palabra clave estática se usa un poco en exceso. Cuando se aplica a la función, significa que la función tiene un enlace interno, es decir, su alcance está limitado a una unidad de traducción (simplemente como un archivo fuente).

En otras palabras, la palabra clave 'estática' hace que la función ya no se pueda llamar desde fuera de su propia unidad, lo que genera el error "no existe tal símbolo".

Eliminar la palabra clave 'estática' resuelve el problema.