Путаница в модулях Rcpp

#r #rcpp

Вопрос:

У меня проблемы с тем, чтобы добраться RCPP_MODULE до работы, Rcpp::Rcpp.package.skeleton() и я не уверен, чего мне не хватает. Я добавил следующий код rcpp_hello_world.cpp в свой пакет ab :

 class A {                                                                                                                                                                                                                                    
public:                                                                                                                                                                                                                                      
  int foo() {                                                                                                                                                                                                                                
    return 1;                                                                                                                                                                                                                                
  }                                                                                                                                                                                                                                          
};                                                                                                                                                                                                                                           
                                                                                                                                                                                                                                             
RCPP_MODULE(ab_module) {                                                                                                                                                                                                                     
  class_<A>("A").                                                                                                                                                                                                                            
    constructor().                                                                                                                                                                                                                           
    method("foo", amp;A::foo);                                                                                                                                                                                                                  
}   
 

Затем я запускаю Rcpp::compileAttributes() и R CMD build и INSTALL посылку. Затем:

 R> library(ab)
R> Rcpp::Module('ab_module', inline::getDynLib('ab'))
Uninitialized module named "ab_module" from package "ab"
Uninitialized module named "ab_module" from package "~/R/x86_64-pc-linux-gnu-library/3.6/ab/libs/ab.so"
Uninitialized module named "ab_module" from package "FALSE"
Uninitialized module named "ab_module" from package "<pointer: 0x5578d469d0e0>"
Uninitialized module named "ab_module" from package "<pointer: 0x5578d35ff690>"
R> rcpp_hello_world()
[[1]]
[1] "foo" "bar"

[[2]]
[1] 0 1

> sessionInfo()
R version 3.6.3 (2020-02-29)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 18.04.4 LTS

Matrix products: default
BLAS:   /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.7.1
LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.7.1

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=nl_NL.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=nl_NL.UTF-8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=nl_NL.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=nl_NL.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] ab_1.0

loaded via a namespace (and not attached):
[1] compiler_3.6.3 inline_0.3.15  Rcpp_1.0.5 
 

Как я могу инициализировать модуль?

Другой код Rcpp работает на этой машине, но мне не удается сузить различия между этими пакетами и этим кодом.

Я пытался вставить import(Rcpp) или importFrom(Rcpp, evalCpp) NAMESPACE вставить, но безрезультатно.

Ответ №1:

Два или три кратких комментария:

  1. Это действительно сложно, поскольку модули Rcpp предшествуют атрибутам Rcpp.
  2. Инициализация модуля происходит из вызова R. У вас есть

    loadModule("AB_module", TRUE)

    куда-нибудь? Обратите внимание , что он может быть в любом файле R/ , вам не требуется его вставлять .onLoad() .

  3. Обновляя пакет в прошлые выходные, я также получил напоминание о том, что вам все равно, возможно, придется добавить R_init_ab(DllInfo *dll) вызов R_CallMethodDef() . Я, вероятно, могу привести вам пример.

Итак, в целом, нам, вероятно, нужна простая виньетка для быстрого запуска «как запустить пакет модулей в 2020 году». И/или перепишите существующую виньетку.

Комментарии:

1. Я думаю, что нашел простое альтернативное решение.

2. Нет, это одно и то же . Я предложил вам добавить loadModule(modulenamehere, TRUE) , и вы это сделали. Как это «альтернатива» ?

3. Вы правы, альтернатива 3. Я рад, что смотреть на 3 не нужно, и, похоже, это не обязательно должно происходить ни в .onLoad() том, ни в другом. Однако моя последняя заметка в ответе озадачивает меня. Почему loadModule() это нельзя сделать в интерактивном режиме?

4. Почему это должно быть так? Вы пишете пакет , и для этого (чтобы угодить R CMD check ) вам также понадобится R_init_* бизнес . Теперь я могу либо помочь вам в этом, либо вы можете продолжать думать, что знаете лучше, и угадывать свой путь. Ваш звонок. (И я предлагаю удалить отсутствие ответа.)

5. Отбросил ответ, внешний вид в любом месте самой упаковки в порядке. Я передаю R CMD check после добавления methods в импорт` с помощью только Rcpp::loadModule('mod_ab', TRUE) R-файла пакета. Однако этот пакет очень прост. Когда R_init_* укусит недостающий? Если у вас есть дополнительная информация по этому поводу, я буду вам признателен. Полезно упомянуть другому читателю: Вам следует знать, что я обнаружил в сочетании с roxygen2: Мне пришлось добавить //' @export в класс. Это имеет смысл, если вы подумаете об этом, но это отличается от Module() подхода.