Доступ к глобальной переменной внутри функции - PullRequest
1 голос
/ 21 июня 2019

У меня есть два data.frames df1 и errors и функция add_to_errors(). Аргументом функции является вектор номеров строк (df1), и функция должна добавить добавленную строку в новый data.frame с именем errors.

.
df1 <- data.frame(id=1:10,
                  var1=rep(NA, 2),
                  var2=rep(NA, 2))

errors <- data.frame()

add_to_errors <- function(ids){
    rows_to_add <- df1[ids,]
    errors <- rbind(errors, rows_to_add)
    return(errors)
} 

add_to_errors(c(1,2))
add_to_errors(c(6,7))

Когда я выполняю add_to_errors(1, 2) и add_to_errors(6,7), это выглядит так, как будто errors перезаписывается при каждом вызове функции. Как я могу получить доступ к errors как к глобальной переменной внутри функции?

Вывод должен выглядеть так:

  id var1 var2
1  1   NA   NA
2  2   NA   NA
3  6   NA   NA
4  7   NA   NA 

Ответы [ 2 ]

5 голосов
/ 21 июня 2019

Я рекомендую не , используя родительский оператор области видимости <<-, и вместо этого использовать вашу функцию с правильным дизайном и инкапсуляцией:

add_to_errors <- function(df1, ids, errors) {
    rows_to_add <- df1[ids,]
    errors <- rbind(errors, rows_to_add)
    return(errors)
}

df1 <- data.frame(id=1:10, var1=rep(NA, 2), var2=rep(NA, 2))
errors <- data.frame()
errors <- add_to_errors(df1, c(1,2), errors)
errors <- add_to_errors(df1, c(6,7), errors)
errors

  id var1 var2
1  1   NA   NA
2  2   NA   NA
6  6   NA   NA
7  7   NA   NA

Вышеприведенные функции были реорганизованы для принятия всех необходимых параметров в качестве входных данных, а выходными данными является кадр данных, сгенерированный с использованием вашей логики. При его вызове мы перекрываем (перезаписываем) кадр входных данных возвращаемым значением.

1 голос
/ 21 июня 2019

Один из способов - использовать <<-, например:

add_to_errors <- function(ids){
  rows_to_add <- df1[ids,]
  errors <<- rbind(errors, rows_to_add)
  return(errors)
} 

add_to_errors(c(1,2))
#  id var1 var2
#1  1   NA   NA
#2  2   NA   NA
add_to_errors(c(6,7))
#  id var1 var2
#1  1   NA   NA
#2  2   NA   NA
#6  6   NA   NA
#7  7   NA   NA

Изменение глобальной среды с помощью <<- внутри функции не считается хорошей практикой (это называется побочным эффектом, и лучшеследует избегать - если возможно - так как это создает ошибки).

...