В кратком справочном руководстве Rcpp показано, как вызывать функцию R из пакета в коде Rcpp. В качестве примера используется пакет статистики. Но если я делаю пакет и хочу вызвать функцию R из этого пакета с помощью Rcpp, также в этом пакете, как мне поступить? Я не пробовал, но полагаю, что, следуя примеру со статистикой, просто заменив статистику на mypackage, это не сработает, потому что во время компиляции mypackage еще не существует. Надеюсь, моя английская формулировка понятна...
Я только что быстро проверил это, и кажется, что эта круговая ссылка все еще работает.
Моя догадка была ошибочной, а @user20650 был прав. Я могу опубликовать быстрый пример.
Настроила быстрый пакет tstpkg
через звонок на Kitten.r с помощью пакета pkgKitten.
Я добавил эту функцию R:
theAnswer <- function() { 42L }
и действительно, мы можем вызвать его из того же пакета, просто не добавляя префикс к какому-либо пространству имен и т. д., как в
#include <Rcpp/Light>
// [[Rcpp::export]]
bool checkAnswer() {
Rcpp::Function f("theAnswer");
int val = Rcpp::as<int>(f());
return val == 42;
}
Быстрый специальный вызов в командной строке подтверждает:
$ Rscript -e 'library(tstpkg); theAnswer(); checkAnswer()'
[1] 42
[1] TRUE
$
Примечания: 1) функция R должна быть экспортирована; 2) если пакет tstpkg не загружен, tstpkg::checkAnswer()
работать не будет (функция R theAnswer
не найдена).
Да, конечно, так как это верно для каждого пакета R. Также обратите внимание, что я сказал, что использовал pkgKitten::kitten
, что создает пространство имен, содержащее стандартный подстановочный знак exportPattern("^[[:alpha:]]+")
. В любом случае я переключился на фиксацию своих ответов, так что вы можете найти полный пакет tstpkg здесь.
Я не могу вспомнить пример, когда вызов делается в один и тот же пакет для упомянутой вами проблемы «циклической ссылки». (Если, конечно, я не упускаю из виду именно то, о чем вы спрашиваете...) Поэтому я думаю, что для безопасности вам может понадобиться пакет зависимостей, который вы можете обеспечить при сборке своего пакета.