Видео: Указатели c++ что это. Для чего нужны. Указатели c++ разыменование. C++ для начинающих. Урок #46 2024
Использование циклов в R очень удобно, но вы можете написать более эффективный код, если вы не выполняете цикл но по индексам. Для этого вы заменяете среднюю часть функции следующим кодом:
nclient <- длина (клиент) VAT <- numeric (nclient) для (i в seq_along (клиент)) {VAT [i] <- switch (client [i], private = 1. 12, public = 1. 06, 1))}
Вот несколько отличий от использования значений вектора для цикла:
-
Вы назначаете длину векторного клиента переменной nclient.
-
Затем вы делаете числовой векторный НДС, который точно такой же, как векторный клиент. Это называется предварительным размещением вектора.
-
Затем вы перебираете индексы клиента вместо самого вектора, используя функцию seq_along (). В первом проходе через цикл первое значение в VAT устанавливается как результат switch (), примененного к первому значению в клиенте. Во втором проходе второе значение НДС является результатом переключения (), применяемого ко второму значению в клиенте, и так далее.
У вас может возникнуть соблазн заменить seq_along (клиент) вектором 1: nclient, но это будет плохая идея. Если векторный клиент имеет длину 0, seq_along (клиент) создает пустой вектор, а код в цикле никогда не выполняется. Если вы используете 1: nclient, R создает вектор c (1, 0) и цикл над этими двумя значениями, что дает вам совершенно неправильный результат.
Каждый раз, когда вы удлиняете объект в R, R должен скопировать весь объект и перенести его в новое место в памяти. Это имеет два эффекта:
-
Во-первых, это замедляет ваш код, потому что все копии требуют времени.
-
Во-вторых, поскольку R постоянно перемещает вещи в памяти, эта память разделяется на множество небольших пространств.
Это называется фрагментацией , и делает связь между R и памятью менее плавной. Вы можете избежать этой фрагментации с помощью предварительной выделения памяти, как в предыдущем примере.