Уже есть отличные решения, но есть еще один вариант, который вносит минимальные изменения в ваш оригинальный код:
testA<- c(1,2,3,4,5)
myFunction <- function(vector1, n)
{
sum1=0
for(i in 1:n)
{
sum1<-sum1+vector1[i]
}
newVector<-c(sum1,vector1[(n+1):length(vector1)]) # we take this line out of the for loop
# and put the n+1 in between parenthesis
return(newVector)
}
newVector <- myFunction(testA, 3)
print(newVector)
Проблема в исходном коде / примере заключалась в том, что n+1:length(vector1)
было возвращено [1] 4 5
, чтобы выполнить соответствующее поднабор (получение последних элементов в векторе, которые не были включены в сумму первых n
элементов), но фактически возвращает [1] 4 5 6 7 8
.Поскольку в позициях 6:8
в testA
нет элементов, это является причиной появления пропущенных значений / NA.
На самом деле n+1:length(vector1)
вначале получает последовательность 1:length(vector1)
изатем добавив n
к каждому элементу.Вот пример такого поведения с использованием значений:
3+1:5
#> [1] 4 5 6 7 8
Мы можем решить эту проблему, поставив n+1
в скобках исходного кода.В нашем примере с использованием значений:
(3+1):5
#> [1] 4 5
Кроме того, удаление назначения newVector
из цикла повышает производительность, поскольку связывание между sum1
и подмножественным вектором необходимо выполнять только после суммирования.из первых n
элементов завершено.