Неожиданное присвоение значения внутри функции

#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 , что добавление переменных в глобальную среду — не лучшая практика.