создание функции двоичного оператора в пакете

Я пытаюсь добавить функцию бинарного оператора в свой пакет, но он не загружается вместе с пакетом. например, я определяю эту функцию и сохраняю ее как файл с именем 'wo.R'

`%wo%` <- function(x, y) {
    x[!x %in% y]
}

и создаю файл документации 'wo.Rd'

\name{\%wo\%}
\alias{\%wo\%}
\title{Without}
\description{Elements in one vector without matching elements in a second vector.}
\usage{x \%wo\% y}
\arguments{
  \item{x}{A vector.}
  \item{y}{A vector.}
}
\value{A vector.}
\author{me, based on example in the \code{\link{match}} function documentation.}
\examples{
(1:10) \%wo\% c(3,7,12)
}

, когда я запускаю R CMD check myPackage выдает эту ошибку при проверке примера документации: Ошибка: не удалось найти функцию "% wo%" Выполнение остановлено . Я могу удалить пример и успешно установить свой пакет, но функция% wo% не загружается с моим пакетом. Я могу получить файл 'wo.R' в сеансе R, и он работает. Я также могу определить функцию как wo , и это, похоже, работает нормально. Я покопался в исходном коде других пакетов, таких как 'операторы', и мои исходные файлы и файлы документации кажутся совместимыми с ними, но я очевидно, что-то не замечает.

-121 --- 14 45458-

Замена чрезвычайно медленной функции pow () У нас есть решатель CFD, и во время моделирования было обнаружено, что он работает чрезвычайно медленно на некоторых машинах, но не работает на других. Используя Intel VTune, было обнаружено, что проблема была в следующей строке (в ...

У нас есть решатель CFD, и во время моделирования было обнаружено, что он работает чрезвычайно медленно на некоторых машинах, но не работает на других.Используя Intel VTune, было обнаружено, что проблема была в следующей строке (в Fortran):

RHOV= RHO_INF*((1.0_wp - COEFF*EXP(F0)))**(1.0_wp/(GAMM - 1.0_wp))

При детализации с помощью VTune проблема была прослежена до сборочной линии call pow , и при трассировке стека она показывала он использовал __ slowpow () . После некоторого поиска, эта страница обнаружила, что жаловалась на то же самое.

На машине с libc версии 2.12 симуляция заняла 18 секунд. На машине с libc версии 2.14 симуляция заняла 0 секунд.

Судя по информации на вышеупомянутой странице, проблема возникает, когда база для pow () близка к 1.0. Итак, мы провели еще один простой тест, в котором мы масштабировали основание произвольным числом перед pow () , а затем делили на число, возведенное в степень после вызова pow () . Это снизило время выполнения с 18 до 0 секунд и с libc 2.12.

Однако нецелесообразно помещать это во весь код, где мы делаем a ** b . Как можно заменить функцию pow () в libc? Например, я хотел бы, чтобы линия сборки call pow , сгенерированная компилятором Fortran, вызывала пользовательскую функцию pow () , которую мы пишем, которая выполняет масштабирование, вызывает libc pow () , а затем делится на масштабирование.Как создать промежуточный слой, прозрачный для компилятора?

Edit

Чтобы уточнить, мы ищем что-то вроде (псевдокода):

double pow(a,b) {
   a *= 5.0
   tmp = pow_from_libc(a,b)
   return tmp/pow_from_libc(5.0, b)
}

Можно ли загрузить pow из libc и переименовать его в нашей пользовательской функции, чтобы избежать конфликты имен? Если файл customPow.o может переименовать pow из libc, что произойдет, если libc все еще понадобится для других вещей? Может ли это вызвать конфликт имен между pow в customPow.o и pow в libc?

24
задан tpg2114 14 February 2012 в 05:45
поделиться