Pacchetto R con codice C, "nessun simbolo simile" nel pacchetto dll
Sto scrivendo un pacchetto R e ho iniziato a includere il codice C in esso. Seguendo le istruzioni da qui , sotto "iniziare con .C()", ho creato la funzione ac in src/ e un wrapper r ad essa, collegandomi tramite il tag roxygen @useDynLib(<package-name>, <name_of_c_function>)
.
Tuttavia, dopo aver eseguito devtools::document()
, ottengo il seguente errore:
Error in FUN(X[[i]], ...) :
no such symbol <name_of_c_function> in package C:/path/to/package/src/<package-name>.dll
Ho letto che l'aggiornamento di R e Rtools ha risolto il problema per alcuni. Li ho aggiornati entrambi ieri, ma senza successo.
Qualsiasi aiuto sarà molto apprezzato.
(Questo è simile al problema in questa domanda , che è attualmente senza risposta.)
(Potrebbe anche essere correlato a this question , tranne per il fatto che utilizzo devtools::document() invece di R CMD in quella domanda.)
Codice rilevante:
# 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) {...}
Risposte
Si scopre che il problema è in questa linea
static void name_of_c_function(...){...}
Come accennato in questo post ,
La parola chiave static è un po' troppo utilizzata. Quando si applica alla funzione, significa che la funzione ha un collegamento interno, cioè il suo ambito è limitato all'interno di un'unità di traduzione (semplicemente come un file sorgente).
In altre parole, la parola chiave 'static' rende la funzione non più richiamabile dall'esterno della propria unità, risultando così nell'errore "no such symbol".
La rimozione della parola chiave 'static' risolve il problema.