Разница между R::runif() и Rcpp::runif()

#rcpp

Вопрос:

Я учусь использовать Rcpp в R. Не могли бы вы объяснить мне разницу между R::runif() и Rcpp::runif().

Я имею в виду 3 вопроса:

  1. Производят ли эти 2 функции один и тот же поток случайных чисел, учитывая, что мы задаем одно и то же начальное значение перед запуском каждой из них ?
  2. Какая функция предпочтительнее при использовании Rcpp ? Я имею в виду, мне кажется, что 2 функции производят одно и то же, но Rcpp::runif() будет работать быстрее.
  3. Как вызвать Rcpp::runif() в файле .R ? Верно ли, что Rcpp::runif() может быть вызван только из файла .cpp, а не в R? (Я имею в виду, мне кажется, что функция Rcpp::runif() широко используется для написания других функций C , затем я импортирую эту функцию с помощью sourcecpp() для использования в R)

Большое вам спасибо за вашу помощь!

Ответ №1:

Я подозреваю, что этот вопрос является дубликатом, поэтому я могу закрыть его, но вот:

  1. Да, это так. Весь смысл интерфейсов RNG заключается в том, чтобы гарантировать именно это
  2. Полностью зависит от вас. Иногда вы хотите обернуть или использовать пример C API, и у вас есть R::runif() для этого. Иногда вам нужны эффективные векторные операции, для которых у вас есть Rcpp::runif() .
  3. Вы пишете функцию C , обращающуюся к API C . Обратите внимание, что не все эти функции будут выполняться быстрее, чем вызов того, что предлагает R, когда то, что предлагает R, уже векторизовано. Ваша упаковка Rcpp::runif() не будет сильно отличаться по производительности от вызова stats::runif() . Вы используете средство доступа C в коде C , написав что-то, что вы не можете легко получить от R.

Правка: В этом посте галереи Rcpp есть некоторые предпосылки и примеры.

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

1. Привет, большое вам спасибо за вашу помощь! я хотел бы кое-что уточнить, если вы не возражаете: — @1: по поводу 2) в вашем ответе, я думаю, все должно быть наоборот, верно ? (т. Е. «иногда вы хотите обернуть или использовать пример API C, и у вас есть $RCPP::RUNIF ()$). — @2: Не могли бы вы любезно рассказать мне, что такое «статистика::» в вашем ответе на 3) пожалуйста ? Я поискал в Интернете, но я не уверен, что это такое. Большое вам спасибо за вашу помощь, а также за разработку Rcpp, вы просто потрясающи.

2. stats:: обозначает пространство имен stats пакета, поставляемого с R, точно так же, как base , utils , tools , stats4 (!!), grid , lattice , … Я обычно stats::runif() делал это явным, если вы печатаете просто runif<Return> для того, чтобы посмотреть на тело runif() функции, вы видите, что она исходит stats . Удачи в чтении Rcpp и обучении шаг за шагом, я надеюсь, что вы продолжите находить это путешествие стоящим.