Несколько вещей, которые я заметил:
- Убедитесь, что вы запустите функцию (вы объявили его здесь, но не запускать)
- Вы экономия по переменной у каждый раз, когда цикл работает. В этом случае ваш результат будет суммой последних двух строк (я не думаю, что это то, что вы хотите).
- x - это вектор, а не кадр данных, поскольку вы выбрали только первый столбец. Таким образом, x [i, 1] создаст ошибку, так как x одномерна. x [i] - это то, что вы хотите.
Вот как вы можете это сделать:
x <- airquality[ , 1]
# Declare your function
fun <- function(x){
y <- numeric()
for (i in 1:(length(x)-1)){
y <- c(y, sum(x[i], x[i+1])) # Add to y with each loop cycle
}
y
}
# Run your function:
fun(x)
Примечание: существуют более эффективные способы сделать это в R, но похоже, что вы могли бы быть более удобным в стиле C++ зацикливание. Но, думаю, лучше, чем идеальный.
редактировать: форматирование
Я попытался бы выполнить ваш код, прежде чем усложнять ситуацию, обернув его функцией. Подсказки: 1) посмотрите на 'dim (x)' его NULL, поскольку он является вектором. Внутри вашего цикла вы индексируете его так, как если бы он имел строки и столбцы, поэтому используйте 'x [i]' и т. Д. (Или используйте ' x <- airquality [, 1, drop = FALSE] 'при создании, чтобы сохранить его размерность) 2) Yuo не индексировал выходной вектор' y', поэтому он будет хранить только последнее значение, а не все. Попробуйте 'y [i]'. 3) Перед циклом вам нужно указать 'y' ...' y <- numeric (length (x)) '4)' x [i + 1] 'не существует для' i = length (x) ' – user20650
Многие вычисления в R могут быть векторизованы, поэтому нет необходимости в циклах. Вы можете сделать это же вычисление с помощью 'tail (x, -1) + head (x, -1)' – user20650
Ошибки возникают из-за того, что x больше не является матрицей или data.frame, поэтому использование функции индексирования с двумя значениями не выполняется. Используйте 'x [i]' и 'x [i + 1' или, как упоминалось, научитесь использовать векторные функции R. –