Исходный код функции `grDevices ::: C_col2rgb`? - PullRequest
1 голос
/ 24 сентября 2019

Как я могу найти исходный код C функции grDevices:::C_col2rgb?

Меня привели к этой функции после тестирования (с помощью R pkg profvis) некоторых функций RGL, а именно rgl:::rgl.quads и функцийназывается там.Соответствующая функция R, которая включает C_col2rgb, - col2rgb от grDevices.Мне интересно посмотреть на источник C_col2rgb, чтобы узнать, смогу ли я сделать более быструю версию.

И, вообще, когда вы сталкиваетесь с функцией C, используемой в R-коде, есть ли какое-то ускорение?способ найти его исходный код?

Большое спасибо!

benchmark

1 Ответ

1 голос
/ 24 сентября 2019

Обычно, когда вы хотите просмотреть исходный код функции R, вы можете просто ввести ее имя в консоли и нажать клавишу ввода.Однако, когда эта функция написана на другом языке, таком как C, и подвергается воздействию R, вы в конечном итоге увидите (что-то вроде)

.Call(C_col2rgb, col, alpha)

, где R вызывает скомпилированный код.Чтобы увидеть исходный код таких функций, вы должны посмотреть исходный код пакета.Функция, о которой вы говорите, находится в пакете grDevices, который является частью того, что часто называют «base R» (его не обязательно путать с пакетом R base) - пакет поставляется со всеми Rустановки.

На GitHub есть зеркало исходного кода R по адресу https://github.com/wch/r-source, с которым я бы хотел посоветоваться, если мне нужно взглянуть на исходный код R.Код для пакета grDevices находится по адресу https://github.com/wch/r-source/tree/trunk/src/library/grDevices.

Как я уже упоминал в комментариях, вы можете найти код для C_col2rgb() в r-source/src/library/grDevices/src/colors.c.Тем не менее, там, похоже, это просто называется col2rgb().Это действительно то же самое?

Да .Если вы обратитесь к Запись R-расширений, раздел 1.5.4 , вы увидите, что

Файл NAMESPACE может содержать одну или несколько директив useDynLib, которые позволяют загружать общие объекты.... Использование аргумента .fixes позволяет автоматически добавлять префикс к зарегистрированным символам, что может быть полезно при работе с существующим пакетом.Например, пакет KernSmooth имеет

useDynLib (KernSmooth, .registration = TRUE, .fixes = "F _")

, что делает переменные R соответствующими символам Фортрана F_bkde и т. Д., Ипоэтому избегайте столкновений с кодом R в пространстве имен.

Мы можем видеть в файле NAMESPACE для grDevices

useDynLib(grDevices, .registration = TRUE, .fixes = "C_")

Итак, функции C, которые доступны из этого пакета, будут все должны иметь префикс C_, даже если их нет в исходном коде C.Это позволяет вам вызывать функции R и C col2rgb без каких-либо проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...