Что я буду делать, будет зависеть от того, почему я пишу код. Если я пишу сценарий анализа данных для своего исследования (дневная работа), я хочу что-то, что работает, но это читается и понятно месяцы или даже годы спустя. Меня не очень заботит время вычислений. Векторизация с помощью lapply
и соавт. может привести к запутыванию, которого я хотел бы избежать.
В таких случаях я бы использовал циклы для повторяющегося процесса, если бы lapply
заставил меня перепрыгнуть через обручи, например, для создания соответствующей анонимной функции. Я бы использовал ifelse()
в вашей первой букве, потому что, по крайней мере, на мой взгляд, намерение этого вызова легче понять, чем версия подмножества + замена. С моим анализом данных я больше озабочен тем, чтобы все было правильно, чем обязательно с временем вычислений - всегда бывают выходные и ночи, когда я не нахожусь в офисе, когда я могу выполнять большие задания.
Для других ваших пуль; Я бы склонялся , а не к встроенным вызовам, если они не были очень тривиальными. Если я четко изложу шаги, я обнаружу, что код легче читать и, следовательно, он с меньшей вероятностью содержит ошибки.
Я пишу пользовательские функции все время, особенно если я собираюсь вызывать код, эквивалентный функции, многократно в цикле или подобном. Таким образом, я инкапсулировал код из основного сценария анализа данных в его собственный файл .R
, который помогает отделить цель анализа от того, как выполняется анализ. И если эта функция полезна, я использую ее для других проектов и т. Д.
Если я пишу код для пакета, я мог бы начать с того же подхода, что и мой анализ данных (знакомство), чтобы получить что-то, что, как я знаю, работает, и только потом пойти на оптимизацию, если я хочу улучшить время вычислений.
Единственное, чего я стараюсь избегать, это то, что слишком умный , когда я кодирую, для чего бы я ни кодировал. В конечном счете, я никогда не бываю таким умным, как мне кажется, и иногда, если я все делаю проще, я не склонен падать на лицо так часто, как мог бы, если бы пытался быть умным.