#r #loops #dataframe #vector #variable-assignment
#r #циклы #Фрейм данных #Вектор #переменная-присвоение
Вопрос:
В R: для данного фрейма данных
df <- data.frame('a'= c(1,3,5,7,9), 'b' = c(2,4,6,8,10), 'c' = c(1,2,3,4,5), 'update' = c(NA, NA, NA, NA, NA))
Я попытался присвоить значения столбцу, используя цикл for, как показано ниже.
Пример 1
testFunction <- function(){
for (i in 1:nrow(df)){
update_val <- df[i,]$a df[i,]$b
df[c(which(df$c==i)),]$update <- update_val
}
}
testFunction()
df$update
Затем я печатаю результат, ожидая увидеть df$update
обновленные соответствующие значения, т.Е. c(3, 7, 11, 15, 19)
. Однако приведенное выше по-прежнему возвращает c(NA,NA,NA,NA,NA).
Приведенные ниже примеры 2 и 3 возвращают желаемый результат.
Пример 2
df$update <- df$a df$b
df$update
Пример 3
testFunction <- function(){
update_val <- NULL
for (i in 1:nrow(df)){
temp <- df[i,]$a df[i,]$b
update_val <- append(update_val, temp)
}
return(update_val)
}
update_val <- testFunction()
df$update <- update_val
df$update
Я просто хочу понять, почему пример 1 не обновляет столбец / вектор, как ожидалось?
Комментарии:
1. Это обновление столбца, но то, что вы делаете внутри функции, не влияет на объекты за пределами этой функции. Если вы изменяете объект, переданный в функцию, и хотите использовать измененный объект, вам необходимо явно вернуть его.
2. Для лучшей читаемости я бы рекомендовал
df[i, "a"]
вместоdf[i, ]$a
3. …кроме того, у вас есть что-то очень странное в вашем примере 3, где вы запускаете цикл for, но затем помещаете
return()
оператор прямо в конец, что означает, что цикл for будет выполняться только один раз; как только он попадет вreturn()
оператор, R завершит работу функции.4. @joran прав. Теперь вы МОГЛИ бы использовать
<<-
оператор вместо<-
, но у этого оператора есть свое особое место, и им не следует злоупотреблять. Этот оператор рекурсивно просматривает текущую область видимости, пока не найдет нужную переменную для изменения.<-
просматривается только текущая область.5. @Sada93 я слышал (читал)
assign
, что добавление переменных в глобальную среду — не лучшая практика.