C для R-программистов - рекомендуемые ресурсы/подходы после прошлых основ
Я бы хотел улучшить свои навыки C, чтобы быть более компетентными в преобразовании R-кода в C, где это было бы полезно. Какие намеки есть у людей, которые помогут мне на моем пути?
Справочная информация. Я несколько недель назад следил за онлайн-курсом Intro to C и что плюс Написание R-расширений и S Programming (Venables и Ripley) позволили мне преобразовать узкое место операции с C, например вычисляя произведение подматриц (я заново изобрел колесо там?). Однако я хотел бы пойти немного дальше этого, например. преобразование больших фрагментов кода, использование подпрограмм линейной алгебры и т.д.
Без сомнения, у меня есть больше возможностей учиться из ресурсов, которые я использовал раньше, но я задавался вопросом, есть ли другие, которые рекомендуют люди? Работа с примерами, очевидно, является одним из способов узнать больше: Брайан Рипли привел несколько примеров перехода от S прототипов к S + C в этом семинаре на Эффективное программирование на S и более поздний семинар Bioconductor Advanced R для биоинформатики (извините, не может размещать гиперссылку) включает в себя лабораторию по написанию алгоритма R + C. Более того, или другие предложения будут оценены.
Ответы
Ответ 1
Я тоже боролся с этой проблемой.
Если проблема заключается в том, чтобы улучшить команду C, есть много списков книг по этому вопросу. Все они начинаются с K & R. Мне понравилось "Программирование программистов-программистов" П. ван дер Линдена и "C-праймер" С. Прата. Любая ссылка на стандартную библиотеку C работает.
Если проблема связана с интерфейсом C с R, другим, кроме вышеупомянутого официального документа R, вы можете проверить этот курс Гарварда, и это краткое руководство по началу работы. Я передал только скалярные массивы и массивы в C, и честно не знал, как взаимодействовать с сложными структурами данных.
Если проблема связана с интерфейсом С++ с R или с навыками С++, я не могу ответить, так как я не использую много С++. Хорошей отправной точкой для меня был "С++ Core Language" (O'Reilly). Очень простой, примитивный, но полезный для людей, приезжающих с C.
Ответ 2
Это очень интересный вопрос. Как бы то ни было, я изучил C и С++ перед тем, как перейти к R, чтобы, возможно, мне стало проще добавлять C/С++ в R.
Но даже с этим я был бы первым, кто сказал бы, что добавление чистого C в R адски усложняется из-за разных макросов и R-внутренних элементов на уровне C, которые вам нужно изучить.
Это приводит меня к моему любимому аргументу: используйте дополнительный слой абстракции, например Rcpp. Он скрывает много неприятных деталей. И я надеюсь, что вам не нужно знать много С++, чтобы использовать его. Одним из примеров использования пакета является небольшой пакет earthmovdist на R-Forge, который использует
Rcpp классы-оболочки для взаимодействия с одной конкретной метрикой.
Изменить 1: Например, см. главная функция earthmovdist здесь, которая, надеюсь, будет достаточно проста для чтения, возможно, с )
Rcpp руководство по пакетам классов оболочки в
одна сторона.
Изменить 2: Три быстрых причины, по которым я считаю С++ более подходящим и R-одинаковым:
-
с помощью Rcpp классы-оболочки означают, что вы никогда
должны использовать PROTECT и UNPROTECT, что является частым источником ошибок и кучи
коррупция, если не отображается
-
используя Rcpp и с контейнерами STL, такими как vector
и т.д., вам не нужно явно вызывать malloc()
/free()
или new
/delete
, который удаляет еще один частой источник ошибки.
-
Rcpp позволяет обернуть все в блоках try
/catch
на уровне С++ и сообщает исключение обратно в R --- поэтому никаких внезапных seg.faults и смертей программы.
Тем не менее, выбор языка - это очень личное решение, и многие пользователи, конечно же, прекрасно довольны интерфейсом более низкого уровня между C и R.
Ответ 3
Моя основная рекомендация - посмотреть на другие пакеты. Излишне говорить, что все пакеты не используют код C, поэтому вам нужно будет найти примеры, которые это делают. Вы можете загрузить исходный код для всех пакетов с CRAN, а в некоторых случаях вы также можете просматривать их на R-Forge. Некоторые проекты R также поддерживаются в Google Code или на сайтах, таких как github (например, ggplot2). Вы найдете код C в каталоге "src".
В общем, подумайте о том, чего вы пытаетесь выполнить, а затем посмотрите на пакеты, которые делают подобные вещи.
Книга "C Programming Language", вероятно, по-прежнему наиболее широко используется, поэтому вы можете захотеть получить ее на своей книжной полке. Следующая бесплатная книга также является полезным ресурсом: http://publications.gbdirect.co.uk/c_book/
Ответ 4
"Какая лучшая книга для изучения C?" perenial fooobar.com/questions/158/... question. (Средняя ссылка, вероятно, самая лучшая.)
Что касается R-специфических способов обучения C, я нашел поучительным загрузить исходный код R и взглянуть на некоторые. Внутренний код.
EDIT: Кто-то еще спросил "Что читать после K & R?"
Ответ 5
Если ваша цель - использовать C, чтобы избавиться от узких мест, вам понадобится хорошая цифровая библиотека в C. Есть много, но я нашел gsl (GNU Scientific Library) довольно полезной.
http://www.gnu.org/software/gsl/
Существует также классическая книга "Численные рецепты на языке C", которая содержит обзор важных численных методов (хотя я не рекомендую использовать их код дословно).