В пакете, как вызвать функцию R из этого пакета с помощью Rcpp?

В кратком справочном руководстве Rcpp показано, как вызывать функцию R из пакета в коде Rcpp. В качестве примера используется пакет статистики. Но если я делаю пакет и хочу вызвать функцию R из этого пакета с помощью Rcpp, также в этом пакете, как мне поступить? Я не пробовал, но полагаю, что, следуя примеру со статистикой, просто заменив статистику на mypackage, это не сработает, потому что во время компиляции mypackage еще не существует. Надеюсь, моя английская формулировка понятна...

Я не могу вспомнить пример, когда вызов делается в один и тот же пакет для упомянутой вами проблемы «циклической ссылки». (Если, конечно, я не упускаю из виду именно то, о чем вы спрашиваете...) Поэтому я думаю, что для безопасности вам может понадобиться пакет зависимостей, который вы можете обеспечить при сборке своего пакета.

Dirk Eddelbuettel 17.04.2023 20:09

Я только что быстро проверил это, и кажется, что эта круговая ссылка все еще работает.

user20650 17.04.2023 20:34

Моя догадка была ошибочной, а @user20650 был прав. Я могу опубликовать быстрый пример.

Dirk Eddelbuettel 17.04.2023 20:43
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
3
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Настроила быстрый пакет 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 не найдена).

Stéphane Laurent 19.04.2023 16:12

Да, конечно, так как это верно для каждого пакета R. Также обратите внимание, что я сказал, что использовал pkgKitten::kitten, что создает пространство имен, содержащее стандартный подстановочный знак exportPattern("^[[:alpha:]]+"). В любом случае я переключился на фиксацию своих ответов, так что вы можете найти полный пакет tstpkg здесь.

Dirk Eddelbuettel 19.04.2023 17:55

Другие вопросы по теме